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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With