动态表达式树如何

时间:2010-03-19 10:40:17

标签: dynamic lambda expression-trees

使用多个方法实现了一个通用存储库。其中之一是:

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')和....

应该动态创建这些查询。 我看了表达树(因为我认为这是我的问题的解决方案 - 顺便说一下我以前从未使用过它们)但我找不到任何指向我的要求。

如何构建它?

提前致谢

2 个答案:

答案 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!