Contains method for compare string array in C#

c# entity-framework extension-methods linq linq-expressions

Question

I want to compare a sting field with a string array using LINQ, I’ve written the below extension method for comparing but it doesn’t work correctly.

 public static bool Contains(this string source, string[] keys)
    {
        foreach (var item in keys)
        {
            if (source.Contains(item))
                return true;
        }

        return false;
    }

And this is my query:

string[] keys = key.Split('+');
        var pages = context.Pages.Where(x => x.Title.Contains(keys));

The error that I’ve got is:

LINQ to Entities does not recognize the method 'Boolean Contains(System.String, System.String[])' method, and this method cannot be translated into a store expression.

1
4
8/14/2013 3:10:00 PM

Accepted Answer

You can't use your own custom methods within LINQ like this - but you may be able to get away with rewriting it using the normal LINQ operators:

string[] keys = key.Split('+');
var pages = context.Pages.Where(x => keys.Any(key => x.Title.Contains(key)));

If that doesn't work, I suspect it's basically infeasible in EF.

7
8/14/2013 3:17:06 PM

Popular Answer

The lambda expression that you write within Where is actually evaluated and translated to SQL by EF. For example when you write

db.Pages.Where(x => x.Title == "Hello")

EF knows to translate the resulting IQueryable<T> to something like:

SELECT ... FROM Pages WHERE title = 'Hello'

Similarly, it knows about some of the common methods and operators, for example:

db.Pages.Where(x => x.Contains("Hello"))

EF knows to translate String.Contains to:

SELECT ... FROM Pages WHERE title LIKE '%Hello%'

However, when you use your own custom methods with the expression, then EF does not know how to translate that custom method to SQL, which is what it complains about in the error message you saw.



Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow