使用多个方法实现了一个通用存储库。其中之一是:
public IEnumerable<T> Find(Expression<Func<T, bool>> where)
{
return _objectSet.Where(where);
}
鉴于<T>
为<Culture>
,很容易将其称为:
Expression<Func<Culture, bool>> whereClause = c => c.CultureId > 4 ;
return cultureRepository.Find(whereClause).AsQueryable();
但现在我看到(意识到)这种查询“仅限于一个标准”。 我想做的是:
在上面的示例中,c是Culture类型。 Culture有几个属性,如CultureId,Name,Displayname,...... 我将如何表达以下内容: CultureId&gt; 4和Name.contains('de')和另一个执行 Name.contains('us')和Displayname.contains('ca')和....
应该动态创建这些查询。 我看了表达树(因为我认为这是我的问题的解决方案 - 顺便说一下我以前从未使用过它们)但我找不到任何指向我的要求。
如何构建它?
提前致谢
答案 0 :(得分:0)
您无需执行任何特殊操作,以下操作:
var whereClause = c => (c.CultureId > 4 && c.Name.Contains("de"));
答案 1 :(得分:0)
Codeka给了我一个暗示,重新思考我的陈述,关于这个限制一个参数。
事实证明,使用所有我们想要查询的属性(具有值)的方案很容易实现。例如,如果Cutlure类型定义为3个属性
名称字符串
Displayname字符串
CultureId int
可以实现像这样的过滤表达式
Expression<Func<Culture, bool>> whereClause = c => (
(!String.IsNullOrEmpty(FilterCulture.Name) ? c.Name.Contains(FilterCulture.Name) : true) &&
(!String.IsNullOrEmpty(FilterCulture.Displayname) ? c.Displayname.Contains(FilterCulture.Displayname) : true) &&
(FilterCulture.CultureId > 0 ? c.CultureId == FilterCulture.CultureId : true)
);
正如您所看到的,我正在使用&amp;&amp;每个属性之间的运算符以缩小结果(可以使用||来扩大结果 - 从而实现OR)。
再次感谢codeka!