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


再次感谢你,科德卡

我想我在最初的帖子里不是很清楚。看看我想出的解决办法。