2009-06-18 83 views
2

我不斷收到異常有關LINQ到實體不支持這樣的certaion查詢表達式:LINQ到實體查詢怪異

MyDataContext db = new MyDataContext() 
Brand = db.Brands.First(b => b.BrandId == Int32.Parse(brandIdString)) 

我不會試圖沿串解析到實體店通過,我只是想將該字符串解析爲一個整數用於比較。唯一的辦法是事先做好這件事情,還是我完全不在這裏?

+0

順便說一句,這也使得它很難做投影w/EF – 2009-06-18 21:29:50

+0

而且你不能以其他方式做,比如Where(expression).Select(item => item.ToString()),因爲它具有無法在查詢中表示ToString。 – 2009-06-18 21:37:11

回答

6

你給的例子最好的選擇(至少)是拉操作出來的您的LINQ聲明:

Int32 brandId = Int32.Parse(brandIdString) 
MyDataContext db = new MyDataContext() 
Brand = db.Brands.First(b => b.BrandId == brandId) 

說明:

當你使用LINQ,它希望找出如何儘可能多的工作來卸載,因爲它可以給您的數據庫查詢。爲了做到這一點,它實際上創建了一個表達式樹,其中包含您告訴它在各種lambda表達式中執行的所有操作。然後,當你想運行查詢時,它會決定什麼SQL語句最適合你要求做的事情。這允許它做一些非常花哨的優化。但是,如果它不知道如何將某些東西轉換爲SQL語句,那麼當您嘗試運行查詢時,它會生氣。

-2

是。這很糟糕。我發現你必須對查詢之外的數據進行解析或標準化......然後傳遞結果。我試圖在查詢範圍內做一些日期格式化時遇到了這個問題。我最終將它從查詢中移出到一個字符串變量中,然後傳遞給已經應用了正確格式的變量。

LAME - 實體框架有很長的路要走!

+0

奇怪的是,我說的與接受的答案相同的東西,但最終被拒絕投票! (:P) – 2009-06-21 21:05:22

0

,你可以用這個?

MyDataContext db = new MyDataContext(); 
Brand b = db.Brands.Where(b => b.BrandId == Int32.Parse(brandIdString)).First(); 

的替代解決方案(不使用Lambda表達式......)是這樣的:

MyDataContext db = new MyDataContext(); 

Brand b = (from Brand b in db.Brands 
      where b.BrandId == Int32.Parse(brandIdString) 
      select b).First(); 

(此外,你錯過了;在每個代碼行的末尾,你有沒有指定你得到了查詢的任何一個變量的名字,但我想那些都是錯別字只在這裏...)

0

的數據庫中不存在服務字符串解析需求。在涉及它之前執行所需的解析。