我正在尝试创建一个过滤器来搜索基本查询中的一个或多个列。它有效,问题是我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();
}
答案 0 :(得分:1)
您需要构建基于列列表组合过滤谓词的表达式树。但是,不是像你提出的那样,你需要构建过滤器表达式,直到使用一种物化方法,才能实现过滤器表达式。
这里有一个很好的例子,说明如何使用表达式树构建动态查询:https://msdn.microsoft.com/en-us/library/mt654267.aspx
如果您想获得一些现成的解决方案,只需尝试如下所述的PredicateBuilder: http://www.albahari.com/nutshell/predicatebuilder.aspx