Entity framework EF 4.1 Linq to实体包含具有列表的工程<;T>;但不是T[]
我在SQLCE4数据库上使用EntityFramework4.1,我的上下文是DbContext 下面代码的目的是搜索“ProtocolName”属性包含在给定列表中的条目列表 此版本的代码将允许值列表作为列表提供,可以正常工作:Entity framework EF 4.1 Linq to实体包含具有列表的工程<;T>;但不是T[],entity-framework,linq-to-entities,entity-framework-4.1,sql-server-ce,contains,Entity Framework,Linq To Entities,Entity Framework 4.1,Sql Server Ce,Contains,我在SQLCE4数据库上使用EntityFramework4.1,我的上下文是DbContext 下面代码的目的是搜索“ProtocolName”属性包含在给定列表中的条目列表 此版本的代码将允许值列表作为列表提供,可以正常工作: List<string> lstPossibles = new List<string>("Name1", "Name2"); query = from le in context.DaLogEvents where lstPossibles.
List<string> lstPossibles = new List<string>("Name1", "Name2");
query = from le in context.DaLogEvents where lstPossibles.Contains(le.ProtocolName) select le;
报告的例外情况是:
“LINQ to实体无法识别“布尔”方法
包含[String](System.String[],System.String)'方法,以及
方法无法转换为存储表达式。“
我花了一段时间才弄明白如何使用List而不是string[],因为我在这个网站上看到了大量关于使用array方法的引用
这是EF 4.1的一个问题吗?使用数组“通常”与使用列表或任何其他IEnumerable
实现一样有效-假设扩展方法包含是IEnumerable
的标准LINQ扩展方法
你得到的例外
...the method 'Boolean Contains[String](System.String[], System.String)'...
。。。这是令人惊讶的,因为它表明编译器没有使用LINQ扩展方法。如果使用LINQ方法,则异常情况如下:
...the method 'Boolean Contains[String](IEnumerable`1[String], System.String)'...
public static class SomeExtensions
{
public static bool Contains<T>(this T[] ary, T value)
{
// ...
}
}
或者更好:如果它使用这种方法,就不会有任何异常
问题是:您是否有一个扩展方法包含string[]
的
——可以是手写的,也可以是从其他程序集/命名空间中包含的?比如:
...the method 'Boolean Contains[String](IEnumerable`1[String], System.String)'...
public static class SomeExtensions
{
public static bool Contains<T>(this T[] ary, T value)
{
// ...
}
}
公共静态类扩展
{
公共静态bool包含(此T[]位,T值)
{
// ...
}
}
如果使用这种方法(您的代码将被编译),您确实会得到异常,因为LINQ to Entities不知道如何将这种自定义方法转换为SQL(“存储表达式”),无论它是如何实现的。使用数组“通常”与使用列表或任何其他IEnumerable
实现一样有效-假定扩展方法包含
是IEnumerable
的标准LINQ扩展方法
你得到的例外
...the method 'Boolean Contains[String](System.String[], System.String)'...
。。。这是令人惊讶的,因为它表明编译器没有使用LINQ扩展方法。如果使用LINQ方法,则异常情况如下:
...the method 'Boolean Contains[String](IEnumerable`1[String], System.String)'...
public static class SomeExtensions
{
public static bool Contains<T>(this T[] ary, T value)
{
// ...
}
}
或者更好:如果它使用这种方法,就不会有任何异常
问题是:您是否有一个扩展方法包含string[]
的
——可以是手写的,也可以是从其他程序集/命名空间中包含的?比如:
...the method 'Boolean Contains[String](IEnumerable`1[String], System.String)'...
public static class SomeExtensions
{
public static bool Contains<T>(this T[] ary, T value)
{
// ...
}
}
公共静态类扩展
{
公共静态bool包含(此T[]位,T值)
{
// ...
}
}
如果使用这个方法(您的代码将被编译),您确实会得到异常,因为LINQ to Entities不知道如何将这样一个自定义方法转换为SQL(“存储表达式”),无论它是如何实现的。太棒了!!这就是问题所在。在一个使用良好且过时的“common/utility”类库中有一个扩展方法,它具有以下特征:publicstaticboolcontains(这个T[]数组,T val)伟大的调用!!这就是问题所在。在一个使用良好且过时的“common/utility”类库中有一个扩展方法,它具有以下签名:publicstaticboolcontains(这个T[]数组,T val)