【问题标题】:Dynamic expression tree how to动态表达式树如何
【发布时间】:2010-03-19 10:40:16
【问题描述】:

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

public IEnumerable<T> Find(Expression<Func<T, bool>> where)
        {
            return _objectSet.Where(where);
        }

鉴于&lt;T&gt;&lt;Culture&gt;,这样称呼很容易:

Expression<Func<Culture, bool>> whereClause = c => c.CultureId > 4 ;

return cultureRepository.Find(whereClause).AsQueryable();

但现在我看到(意识到)这种查询是“仅限于一个标准”。 我想做的是:

在上面的例子中,c 是 Culture 类型。 Culture 有几个属性,例如 CultureId、Name、Displayname... 我将如何表达以下内容: CultureId > 4 和 Name.contains('de') 并在另一个执行中 Name.contains('us') 和 Displayname.contains('ca') 和 ....

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

如何构建?

提前致谢

【问题讨论】:

    标签: dynamic lambda expression-trees


    【解决方案1】:

    您不需要做任何特别的事情,以下将起作用:

    var whereClause = c => (c.CultureId > 4 && c.Name.Contains("de"));
    

    【讨论】:

    • 我想我在最初的帖子中并不是很清楚。看看我想出的解决方案。
    【解决方案2】:

    Codeka 给了我一个提示,让我重新思考我的陈述,关于这个对一个参数的限制。

    事实证明,使用 所有 我们想要查询的属性(这些属性具有值)来实现场景非常容易。例如,如果 Cutlure 类型定义了 3 个属性

    名称字符串

    显示名称字符串

    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)
                    );
    

    如您所见,我在每个属性之间使用 && 运算符来缩小结果范围(可以使用 || 来扩大结果范围 - 从而实现 OR)。

    再次感谢codeka!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多