开发者

Dynamic expression tree how to

Implemented a generic repository with several Methods. One of those is this:

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

Given <T> to be <Culture> it is easy to call this like this:

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

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

But now i 开发者_运维问答see (realize) that this kind of quering is "limiting only to one criteria". What i would like to do is this:

in the above example c is of type Culture. Culture has several properties like CultureId, Name, Displayname,... How would i express the following: CultureId > 4 and Name.contains('de') and in another execution Name.contains('us') and Displayname.contains('ca') and ....

Those queries should be created dynamically. I had a look in Expression trees (as i thought this to be a solution to my problem - btw i never used them before) but i cannot find anything which points to my requirement.

How can this be costructed?

Thanks in advance


You don't need to do anything special, the following will work:

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


Codeka gave me a hint for re-thinking my statement, regarding this limitation to one parameter.

Turns out it very easy to implement a scenario with all the properties we want to query, which have values. For example if the Cutlure type is defined with 3 properties

Name string

Displayname string

CultureId int

than one can implement a Filter-Expression like this

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

As you can see i 'm using the && operator between each property to narrow the results (one could use the || to widen the results - thus implementing OR).

Thank you again codeka !

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜