2012-01-03 20 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