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

时间:2013-08-14 15:10:01

标签: c# linq entity-framework extension-methods 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;
    }

这是我的疑问:

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

我得到的错误是:

  

LINQ to Entities无法识别方法'布尔值   包含(System.String,System.String [])'方法和此方法   无法翻译成商店表达。

3 个答案:

答案 0 :(得分:7)

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

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

如果没有工作,我怀疑它在EF中基本上是不可行的。

答案 1 :(得分:5)

您在Where内编写的 lambda表达式实际上是由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,这就是它在您看到的错误消息中所抱怨的内容。

答案 2 :(得分:1)

  

LINQ to Entities无法识别方法&#39;布尔包含(System.String,System.String [])&#39;方法,并且此方法无法转换为商店表达式。

看到您的代码正在被翻译成SQL,如果我没有错,您的错误说&#39;布尔包含(System.String,此方法无法翻译,这意味着此特定部分无法将自己转换为SQL,如果你将你的字符串转换为BIT它可能会有效。如果有人觉得我可能方向错误,请告诉我。