包含C#中比较字符串数组的方法

Sae*_*med 4 c# linq extension-methods entity-framework linq-expressions

我想使用LINQ将sting字段与字符串数组进行比较,我已经编写了下面的扩展方法进行比较,但它无法正常工作.

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

        return false;
    }
Run Code Online (Sandbox Code Playgroud)

这是我的疑问:

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

我得到的错误是:

LINQ to Entities无法识别方法'Boolean Contains(System.String,System.String [])'方法,并且此方法无法转换为商店表达式.

Jon*_*eet 7

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

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

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


Ere*_*mez 5

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

db.Pages.Where(x => x.Title == "Hello")
Run Code Online (Sandbox Code Playgroud)

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

SELECT ... FROM Pages WHERE title = 'Hello'
Run Code Online (Sandbox Code Playgroud)

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

db.Pages.Where(x => x.Contains("Hello"))
Run Code Online (Sandbox Code Playgroud)

EF知道翻译String.Contains为:

SELECT ... FROM Pages WHERE title LIKE '%Hello%'
Run Code Online (Sandbox Code Playgroud)

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