Linq对实体的表达式树,其中对匿名类型

本文关键字:类型 实体 表达式 Linq | 更新日期: 2023-09-27 18:14:42

我正在尝试创建一个过滤器来搜索基本查询上的一个或多个列。它的工作,问题是,我是100%肯定,这不是最佳的,因为查询呈现和搜索是通过代码(不是由MSSQL)执行

所以我的问题是:我可以通过表达式树(不熟悉它)做到这一点,所以查询是在数据库端生成的吗?

p。s:我不想使用动态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();
}

Linq对实体的表达式树,其中对匿名类型

需要根据列列表构建组合过滤器谓词的表达式树。但是,不是像你所展示的那样做,你需要构建一个过滤器表达式,它不会被物化,直到其中一个物化方法被使用。

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

如果你想得到一些现成的解决方案,只需尝试像下面描述的PredicateBuilder:http://www.albahari.com/nutshell/predicatebuilder.aspx