views:

225

answers:

2

Hello everybody!

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

A: 

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

var whereClause = c => (c.CultureId > 4 && c.Name.Contains("de"));
Dean Harding
I think i wasn't very clear in my initial post. Look at the solution i came up.
Savvas Sopiadis
A: 

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 !

Savvas Sopiadis