Dynamic 动态表达式树如何
使用多种方法实现了一个通用存储库。其中之一是:Dynamic 动态表达式树如何,dynamic,lambda,expression-trees,Dynamic,Lambda,Expression Trees,使用多种方法实现了一个通用存储库。其中之一是: public IEnumerable<T> Find(Expression<Func<T, bool>> where) { return _objectSet.Where(where); } 考虑到这一点,我们很容易这样称呼: Expression<Func<Culture, bool>> whereClause = c =>
public IEnumerable<T> Find(Expression<Func<T, bool>> where)
{
return _objectSet.Where(where);
}
考虑到这一点,我们很容易这样称呼:
Expression<Func<Culture, bool>> whereClause = c => c.CultureId > 4 ;
return cultureRepository.Find(whereClause).AsQueryable();
但是现在我意识到这种查询只限于一个标准。
我想做的是:
在上面的示例中,c是文化类型。区域性有几个属性,如CultureId、Name、Displayname等,。。。
我将如何表达以下内容:
CultureId>4和Name.在另一个执行中包含“de”和
名称。包含'us'和Displayname。包含'ca'和
这些查询应该动态创建。
我看了一下表达式树,因为我认为这是我问题的解决方案——顺便说一句,我以前从未使用过它们,但我找不到任何符合我要求的东西
这是如何构建的
提前感谢您不需要做任何特殊的事情,以下操作将起作用:
var whereClause = c => (c.CultureId > 4 && c.Name.Contains("de"));
Codeka给了我一个重新思考我的陈述的提示,关于一个参数的限制 事实证明,使用我们想要查询的所有属性实现一个场景非常容易,这些属性都有值。例如,如果Cutlure类型是用3个属性定义的 名称字符串 显示名称字符串 文化ID 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)
);
正如您所看到的,我在每个属性之间使用了&&运算符来缩小结果范围,可以使用| |来扩大结果范围,从而实现OR
再次感谢你,科德卡 我想我在最初的帖子里不是很清楚。看看我想出的解决办法。