我想用LINQ比较一个sting字段和一个string数组,我编写了下面的扩展方法来进行比较,但是它不能正确地工作。
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不识别方法'Boolean (System.String,System.String[])‘方法,并且该方法不能被转换为存储表达式。
发布于 2013-08-14 07:17:06
您不能像这样在LINQ中使用您自己的自定义方法--但是您可以使用普通的LINQ运算符重写它:
string[] keys = key.Split('+');
var pages = context.Pages.Where(x => keys.Any(key => x.Title.Contains(key)));
如果这不起作用,我怀疑这在EF中基本上是不可行的。
发布于 2013-08-14 07:37:42
您在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,这正是它在您看到的错误消息中所抱怨的。
发布于 2013-08-14 07:44:22
LINQ不识别方法'Boolean (System.String,System.String[])‘方法,并且该方法不能被转换为存储表达式。
看到您的代码正在被转换为SQL,如果我没有错,您的错误说明的布尔包含(System.String,此方法不能被翻译,这意味着这个特定的部分无法转换为SQL,如果您将字符串转换为BIT,它可能会工作。如果有人认为我可能在错误的方向,请告诉我。
https://stackoverflow.com/questions/18235472
复制