EF 4.1 Linq to Entities包含List <t>但不包含T [] </t>的工作

时间:2011-11-09 19:14:27

标签: entity-framework linq-to-entities entity-framework-4.1 sql-server-ce contains

我在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的问题吗?

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”),无论它是如何实现的