繁体   English   中英

动态表达式树如何

[英]Dynamic expression tree how to

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

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

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

如何构建?

提前致谢

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

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

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

事实证明,使用要查询的所有具有值的属性来实施方案非常容易。 例如,如果使用3个属性定义了Cutlure类型

名称字符串

显示名称字符串

CultureId int

可以实现这样的Filter-Expression

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!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM