2012-01-03 52 views
1

我试图做到这一点:中的LINQ在C#中的错误

myList = (from c in ipE.Cars 
      where (someListOfIntegers.Contains(idCar) && c.name == someName) 
      select c).ToList(); 

我得到eror LINQ to实体不能识别方法“布尔包含(Int32)已”的方法,而这种方法不能被翻译成商店表达。

我试过任何,它仍然无法正常工作。我得到了错误无法创建类型'闭合类型'的常量值。在此上下文中仅支持基本类型(如Int32,String和Guid)。

如何解决这个问题?

+0

你有;'在代码文件的顶部? – Sjoerd 2012-01-03 10:08:50

+0

@Sjoerd“无法转换成存储表达式”是运行时/提供程序错误,不是编译器错误;一个'using'指令不是问题 – 2012-01-03 10:09:29

+0

@Marc Gravell再次读到问题,用户提到Linq为Entities – Reniuz 2012-01-03 10:10:53

回答

4

你似乎在暗示(评论)是idCar不涉及任何实体 - 在这种情况下,不这样做,在查询:`使用System.Linq的

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 
} 
5

不幸的是,你不能在EF查询中使用本地集合。你可以解决它,通过使用PredicateBuilder并在OR个序列手动翻译Contains操作:

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(); 

旁注:我想,你有你的问题中一个错字,因为无论someListOfIntegers也不idCar是您查询的EF模型的属性。所以我想你想查询Car.idCar?

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

-1

我自己也一样:L2E使用一小组命令 - 并且没有“Contains(Int32)”命令。

如果您的列表非常小,那么请尝试添加“.AsEnumerable()”,它将执行T-SQL select语句并为您提供可使用Contains的POCO对象。 例如

myList = (from c in ipE.Cars.AsEnumerable 
     where (someListOfIntegers.AsEnumerable().Contains(idCar) 
     && c.name == someName)   
     select c) 
     .ToList(); 

不知道你是否需要两个AsEnumerables ...试试吧!

+2

中执行此操作“并且不存在”Contains(Int32)“命令在T-SQL中“,是的 - 它会是'table.Column in(@ the,@ list,@ of,@ integers)' - 其他提供者可以做得很好。在这里添加'AsEnumerable()'实际上**非常危险 - 你现在将整个表拉到调用者。 – 2012-01-03 10:12:39

+1

@BlueChippy我得到一个错误。 – 2012-01-03 10:13:38

+0

我也得到一个错误...我也写了“如果你的名单是相当小的”,以确保它拉动所有的表,但这可能是好的。 – BlueChippy 2012-01-30 04:23:37