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();
}
需要根据列列表构建组合过滤器谓词的表达式树。但是,不是像你所展示的那样做,你需要构建一个过滤器表达式,它不会被物化,直到其中一个物化方法被使用。
这里你有一个很好的例子如何使用表达式树来构建动态查询:https://msdn.microsoft.com/en-us/library/mt654267.aspx
如果你想得到一些现成的解决方案,只需尝试像下面描述的PredicateBuilder:http://www.albahari.com/nutshell/predicatebuilder.aspx