EF:如何将列名称动态传递给where子句 [英] EF: How to pass column name dynamically to where clause

查看:156
本文介绍了EF:如何将列名称动态传递给where子句的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不在dev pc之前。我刚刚开始与EF合作。

i am not before dev pc. i just started working with EF. so curious to know can we pass column name dynamically for where clause.

查看用于搜索网格的屏幕快照。

see a screen shot for searching grid.

我只是编写了一个示例查询。请告诉我它有用吗?

i just compose a sample query. please tell me does it work?

public ActionResult Index(String ColumnName,String SearchText)
{

    private CustomersEntities db = new CustomersEntities();

    var customer = (from s in db.Customers
                    select new CustomerDTO
                    {
                    CustomerID = s.CustomerID,
                    CompanyName = s.CompanyName,
                    ContactName = s.ContactName,
                    ContactTitle = s.ContactTitle,
                    Address = s.Address
                    })
    .Where(s => s.Field<string>(ColumnName).ToUpper().Contains(SearchText.ToUpper());

    return View(customer);

}

谢谢

推荐答案

public ActionResult Index(string ColumnName, string SearchText)
{
    var arg = Expression.Parameter(typeof(Customer), "x");

    var strType = typeof(string);
    var ToUpperMeth = strType.GetMethods().Where(x => x.Name == nameof(string.ToUpper) 
                                          && x.GetParameters().Count() == 0).Single();
    var ContainsMeth = strType.GetMethods().Where(x => x.Name == nameof(string.Contains) 
                                          && x.GetParameters().Count() == 1).Single();

    var exprVal = Expression.Constant(SearchText);
    var toUpExprVal = Expression.Call(exprVal, ToUpperMeth);

    var exprProp = Expression.Property(arg, ColumnName);
    var toUpExpr = Expression.Call(exprProp, ToUpperMeth);
    var contExpr = Expression.Call(toUpExpr, ContainsMeth, toUpExprVal);

    var predicate = Expression.Lambda<Func<Customer, bool>>(contExpr, arg);

    var customer = (from s in db.Customers
                    select new CustomerDTO
                    {
                        CustomerID = s.CustomerID,
                        CompanyName = s.CompanyName,
                        ContactName = s.ContactName,
                        ContactTitle = s.ContactTitle,
                        Address = s.Address
                    }).Where(predicate).ToList();

    return View(customer);
}

这篇关于EF:如何将列名称动态传递给where子句的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆