C# Linq-IN-C错误

C# Linq-IN-C错误,c#,linq,C#,Linq,我正在尝试这样做: myList = (from c in ipE.Cars where (someListOfIntegers.Contains(idCar) && c.name == someName) select c).ToList(); 我得到的eror LINQ to实体无法识别“Boolean ContainsInt32”方法,并且该方法无法转换为存储表达式 我试过了,但还是不行。无法创建“Closure type”类型的常

我正在尝试这样做:

myList = (from c in ipE.Cars
          where (someListOfIntegers.Contains(idCar) && c.name == someName)
          select c).ToList();
我得到的eror LINQ to实体无法识别“Boolean ContainsInt32”方法,并且该方法无法转换为存储表达式

我试过了,但还是不行。无法创建“Closure type”类型的常量值时出错。在此上下文中仅支持基本类型“如Int32、String和Guid”


如何解决此问题?

不幸的是,您不能在EF查询中使用本地集合。您可以通过按ORs顺序手动使用和转换Contains操作来解决此问题:

旁注:我假设您的问题中有一个输入错误,因为SomeListofInteger和idCar都不是您查询的EF模型的属性。所以我猜你想查询Car.idCar


否则,您可以完全从EF查询中重构包含。

不幸的是,您不能在EF查询中使用本地集合。您可以通过按ORs顺序手动使用和转换Contains操作来解决此问题:

旁注:我假设您的问题中有一个输入错误,因为SomeListofInteger和idCar都不是您查询的EF模型的属性。所以我猜你想查询Car.idCar


否则,您可以完全从EF查询中重构Contains。

我自己也看到了同样的情况:L2E使用一小组命令,而ContainsInt32命令并不存在

如果列表非常小,请尝试添加.AsEnumerable,它将执行T-SQL select语句,并为您留下可以使用Contains的POCO对象。 e、 g


不确定是否需要这两个asenumerable…试试看

我自己也看到了同样的情况:L2E使用了一小部分命令,而没有ContainsInt32命令

如果列表非常小,请尝试添加.AsEnumerable,它将执行T-SQL select语句,并为您留下可以使用Contains的POCO对象。 e、 g


不确定是否需要这两个asenumerable…试试看

您似乎在建议idCar与任何实体都不相关的注释-在这种情况下,请不要在查询中这样做:


您似乎在建议idCar与任何实体都不相关的注释-在这种情况下,请不要在查询中这样做:


你有使用系统吗;在代码文件的顶部?@sjoord无法转换为存储表达式是运行时/提供程序错误,而不是编译器错误;using指令并不是问题的关键。是否MelistoFintegers和idCar似乎不是来自您的db对象?或者你是说c.idCar?那么我不明白,为什么你要把它包括在你的EF查询中?正如简所说;如果该测试与数据库没有任何关系,那么列表和值都不在数据库中-不要在QUERYDo中执行,因为您使用的是System.Linq;在代码文件的顶部?@sjoord无法转换为存储表达式是运行时/提供程序错误,而不是编译器错误;using指令并不是问题的关键。是否MelistoFintegers和idCar似乎不是来自您的db对象?或者你是说c.idCar?那么我不明白,为什么你要把它包括在你的EF查询中?正如简所说;如果该测试与数据库没有任何关系,则列表和值都不在数据库中-不要在查询中执行该测试,并且在该上下文中T-SQL中没有CONTAINSTIN32命令,是的,有-它将是@the、@list、@of、@integers中的table.Column-其他提供程序在这方面做得很好。在这里添加一个numerable是非常危险的-您现在正在将整个表拉到调用者。我也遇到了一个错误…我还写了一篇文章,如果您的列表非常小,以确保它确实拉到了所有表,但这可能没问题。在这种情况下,t-SQL中没有CONTAINSTIN32命令,是的,有-应该是@the、@list、@of、@integers中的table.Column-其他提供程序在这方面做得很好。在这里添加一个numerable是非常危险的-您现在正在将整个表拉给调用者。我也得到了一个错误…我还写了一篇文章,如果您的列表相当小,以确保它确实拉了所有表,但这可能没问题。
var predicate = PredicateBuilder.False<Car>();
foreach (int id in someListOfIntegers)
{
   int temp = id;
   predicate = predicate.Or (car => car.idCar == id);
}


myList = (from c in ipE.Cars
    where predicate && c.name == someName)
    select c).ToList();
myList = (from c in ipE.Cars.AsEnumerable
       where (someListOfIntegers.AsEnumerable().Contains(idCar) 
       && c.name == someName)           
       select c)
       .ToList(); 
List<Car> list;
if(someListOfIntegers.Contains(idCar)) {
    myList = (from c in ipE.Cars
              where c.name == someName
              select c).ToList();
} else {
    myList = new List<Car>(); // no need to touch the DB
}