Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF 4.1 Linq to实体包含具有列表的工程<;T>;但不是T[]_Entity Framework_Linq To Entities_Entity Framework 4.1_Sql Server Ce_Contains - Fatal编程技术网

Entity framework EF 4.1 Linq to实体包含具有列表的工程<;T>;但不是T[]

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.

我在SQLCE4数据库上使用EntityFramework4.1,我的上下文是DbContext

下面代码的目的是搜索“ProtocolName”属性包含在给定列表中的条目列表

此版本的代码将允许值列表作为列表提供,可以正常工作:

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)