代码之家  ›  专栏  ›  技术社区  ›  Savvas Sopiadis

动态表达式树如何

  •  0
  • Savvas Sopiadis  · 技术社区  · 16 年前

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

    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”)和….

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

    这是怎么做的?

    提前谢谢

    2 回复  |  直到 16 年前
        1
  •  0
  •   Dean Harding    16 年前

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

    var whereClause = c => (c.CultureId > 4 && c.Name.Contains("de"));
    
        2
  •  0
  •   Savvas Sopiadis    16 年前

    CODEKA给了我一个重新思考我的声明的提示,关于这个参数的限制。

    事实证明,使用 全部的 我们要查询的属性,其中包含值。例如,如果用3个属性定义CutLure类型

    名称字符串

    显示名称字符串

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

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

    再次感谢你,科德卡!