我遇到了为基于EF6的Web应用程序动态生成谓词的函数时出现问题。
我需要将此类型传递给已存在的函数:
Expression<Func<MyModelType, bool>>
这是一个搜索,所以我需要根据搜索的哪些字段和搜索字词构建查询。我尝试了以下但我不能让它变得动态,它总是包括所有搜索术语,无论是否存在搜索词,例如下面我总是想在Field1中搜索searchTerm1但是如果值存在则只搜索searchTerm2部分对于它,但EF查询无论如何都包括这部分查询,因此它导致搜索速度慢。
Expression<Func<MyModelType, bool>> predicates = null;
predicates = (
p => (
p.Field1.ToString().ToLower() == (searchTerm1.ToLower())
)
&&
(string.IsNullOrEmpty(searchTerm2) || (
p.Field1.ToString().Contains(searchTerm2)
||
p.Field2.ToString().Contains(searchTerm2.ToLower())))
);
我希望它能以这样的方式完成:
If(!string.IsNullOrEmpty(searchTerm1))
query.Add(q=>q.FieldX.Equals(searchTerm1)
If(!string.IsNullOrEmpty(searchTerm2))
query.Add(q=>q.FieldCountry.Equals(searchTerm2)
If(!string.IsNullOrEmpty(searchTerm3))
query.Add(q=>q.Keywords.Contains(searchTerm3)
等等只是一种在表达式查询中具有和不存在的方式。
我创建了一个Expression<Func<MyEntity,bool>>
的列表,但我无法将其转换为单个表达式以传递给我的函数。