linq到实体表达式树在匿名类型上的位置

时间:2016-10-23 13:49:34

标签: c# linq

我正在尝试创建一个过滤器来搜索基本查询中的一个或多个列。它有效,问题是我100%确定它不是最佳的,因为查询是渲染的,搜索是通过代码(而不是MSSQL)执行的

所以我的问题是:我可以通过表达式树(不熟悉它)这样做,所以查询是在db方面生成的吗?

p.s:我不想使用Dynamic LINQ

谢谢!

 var basequery = (from x in db.table1
                             join x1 in db.table2 on x.id equals x1.someid
                             where x.deleted != null && x.moreCondition = "blah"
                             select new {
                                 x.field1,
                                 x.fiedl2
                                 x2.field1,
                                 x2.field3
                             });

对基本查询应用过滤器以搜索每个列:

foreach (var item in Columns)
{

     basequery = basequery.AsEnumerable()
    .Where(i => (i.GetType().GetProperty(item.Data)
        .GetValue(i, null) ?? string.Empty).ToString().ToUpper().Contains(item.Search.Value.ToUpper())).AsQueryable();
}

1 个答案:

答案 0 :(得分:1)

您需要构建基于列列表组合过滤谓词的表达式树。但是,不是像你提出的那样,你需要构建过滤器表达式,直到使用一种物化方法,才能实现过滤器表达式。

这里有一个很好的例子,说明如何使用表达式树构建动态查询:https://msdn.microsoft.com/en-us/library/mt654267.aspx

如果您想获得一些现成的解决方案,只需尝试如下所述的PredicateBuilder: http://www.albahari.com/nutshell/predicatebuilder.aspx