我在SQLCE 4数据库上使用Entity Framework 4.1,我的上下文是DbContext。
以下代码的目的是搜索给定列表中包含“ProtocolName”属性的条目列表。
此版本的代码提供允许值列表作为List工作正常:
List<string> lstPossibles = new List<string>("Name1", "Name2");
query = from le in context.DaLogEvents where lstPossibles.Contains(le.ProtocolName) select le;
但是,在调用query.ToList()时,以允许值作为数组提供的此版本代码会引发异常:
string[] aryPossibles = new string[] { "Name1", "Name2" };
query = from le in context.DaLogEvents where aryPossibles.Contains(le.ProtocolName) select le;
报告的例外是:
“LINQ to Entities无法识别方法'布尔值 包含[String](System.String [],System.String)'方法,以及此方法 方法无法转换为商店表达式。“
我花了一段时间才想出使用List而不是string [],因为我在这个网站上看到过相当多的引用来使用数组方法。
这只是EF 4.1的问题吗?
答案 0 :(得分:0)
使用数组“通常”可以使用列表或任何其他IEnumerable<string>
实现 - ,因为扩展方法Contains
是标准的LINQ扩展方法IEnumerable<T>
。
你得到的例外......
...the method 'Boolean Contains[String](System.String[], System.String)'...
...令人惊讶,因为它表明编译器不使用LINQ扩展方法。如果它将使用LINQ方法,则异常将类似于:
...the method 'Boolean Contains[String](IEnumerable`1[String], System.String)'...
或者更好:如果它会使用这种方法,那就不会有例外。
问题是:你有Contains
的扩展方法string[]
- 手写或者可能包含在其他程序集/命名空间中吗?类似的东西:
public static class SomeExtensions
{
public static bool Contains<T>(this T[] ary, T value)
{
// ...
}
}
如果使用了这个东西(你的代码会编译),你确实会得到异常,因为LINQ to Entities不知道如何将这样的自定义方法转换为SQL(=“store expression”),无论它是如何实现的