[英]Dynamic expression tree how to
用几种方法实现了通用存储库。 其中之一是:
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具有几个属性,例如CultureId,Name,Displayname等。我将如何表达以下内容:CultureId> 4和Name.contains('de'),在另一个执行中,Name.contains('us')和Displayname.contains( 'ca')和...。
这些查询应动态创建。 我看过表达式树(因为我认为这是解决我的问题的方法-顺便说一句,我以前从未使用过它们),但是我找不到任何指向我要求的东西。
如何构建?
提前致谢
您不需要做任何特殊的事情,以下方法将起作用:
var whereClause = c => (c.CultureId > 4 && c.Name.Contains("de"));
Codeka给了我一个重新思考我的陈述的暗示,关于这个对一个参数的限制。
事实证明,使用要查询的所有具有值的属性来实施方案非常容易。 例如,如果使用3个属性定义了Cutlure类型
名称字符串
显示名称字符串
CultureId int
可以实现这样的Filter-Expression
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)
);
如您所见,我在每个属性之间使用&&运算符来缩小结果范围(可以使用||来扩大结果范围,从而实现OR)。
再次感谢您codeka!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.