Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Contains method for compare string array in C#

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.

like image 544
Saeed Hamed Avatar asked Dec 16 '22 07:12

Saeed Hamed


2 Answers

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.

like image 71
Jon Skeet Avatar answered Dec 18 '22 12:12

Jon Skeet


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.

like image 36
Eren Ersönmez Avatar answered Dec 18 '22 10:12

Eren Ersönmez