Question

Let's say I have this method to seach my DB for products that fit a certain keyword:

public List<Product> GetByKeyword(string keyword)
{
    using(var db = new DataEntities())
    {
        var query = db.Products.Where(x => x.Description.Contains(keyword);
        return query.ToList();
    }
}

This works fine, but somewhere else in my project, I want to get the active products only, still by keyword. I would like to do something like :

...
var result = ProductStore.GetByKeyword("Apple", x => x.isActive == 1);

Therefore, I created this method:

public List<Product> GetByKeyword(string keyword, Func<Product, bool> predicate = null)
{
    using(var db = new DataEntities())
    {
        var query = db.Products.Where(x => x.Description.Contains(keyword);
        if(predicate != null)
            query = query.Where(x => predicate(x));

        return query.ToList();
    }
}

While this compiles well, the ToList() call generates a NotSupportedException because LINQ does not support the Invoke method.

Of course, I could to it with another method i.e. GetActiveByKeyword(string keyword) but then I would have to do one for every possible variation, including the ones I didn't think of...

How do I get this to work? Thanks!

Was it helpful?

Solution

Isn't it just this:

if(predicate != null)
            query = query.Where(predicate);

OTHER TIPS

it's just as AD.Net says the reason why it works with Expression before is because if you say that the compiler knows it would be a lambda expression

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top