4

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.

4

3 回答 3

7

您不能像这样在 LINQ 中使用自己的自定义方法 - 但您可以使用普通的 LINQ 运算符重写它:

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

如果这不起作用,我怀疑它在 EF 中基本上是不可行的。

于 2013-08-14T15:17:06.617 回答
4

您在其中编写的lambda 表达式Where实际上由 EF 评估并转换为 SQL。例如当你写

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

EF 知道将结果转换为IQueryable<T>

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

同样,它知道一些常用的方法和运算符,例如:

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

EF 知道翻译String.Contains为:

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

但是,当您将自己的自定义方法与表达式一起使用时,EF 不知道如何将该自定义方法转换为 SQL,这就是它在您看到的错误消息中所抱怨的。

于 2013-08-14T15:37:42.473 回答
1

LINQ to Entities 无法识别“Boolean Contains(System.String, System.String[])”方法,并且该方法无法转换为存储表达式。

看到你的代码正在被翻译成 SQL,如果我没有错,你的错误说'Boolean Contains(System.String,这个方法不能被翻译,这意味着这个特定的部分无法将自己转换成 SQL,如果你转换你的字符串作为 BIT,它可能会起作用。好吧,如果有人觉得我可能走错了方向,请告诉我。

于 2013-08-14T15:44:22.513 回答