2014-09-02 48 views
0

我正在開發一個項目,將Linq轉換爲SQL(我承認這很難理解),並且遇到了奇怪的情況。下面的代碼在針對Linq to SQL設計器中生成的類進行求值時正確返回結果,但在針對實體框架實體運行時無法運行。特別是如果Or子句中的任何屬性都爲空,則該進程將打破Null引用異常。我試過技術檢查空屬性,然後說,傳遞一個值,我知道不能在SearchTerm周圍短路,但他們只是導致這個LINQ返回來自實體的所有結果,我以某種方式返回真的不明白。當使用LINQ包含實體框架時的NullReference異常

 Return (From values In Location.getData _ 
       Where (values.LocName.Contains(SearchTerm) _ 
       Or values.Address.Contains(SearchTerm) _ 
       Or values.Address2.Contains(SearchTerm) _ 
       Or values.City.Contains(SearchTerm) _ 
       Or values.State.Contains(SearchTerm) _ 
       Or values.QIM.Contains(SearchTerm) _ 
       Or values.MacID.Contains(SearchTerm) _ 
       Or values.Phone.Contains(SearchTerm) _ 
       Or values.PrimServ.Contains(SearchTerm) _ 
       Or values.Zip.Contains(SearchTerm) _ 
       Or values.Area.Contains(SearchTerm) _ 
       Or values.Type.Contains(SearchTerm) 
       ) And (values.Status <> "Closed" Or status_parm = "Closed") 
      Select values) 

正如你可以基本上是使用DbContext.SqlQuery構造查詢到數據庫中,然後被用於這個LINQ過濾結果可能猜到的實體類位置GetData方法。我意識到有幾個問題使得它不夠理想,但是有一些原因是我在開始轉換之前以這種方式編寫的,這些問題不容易改變。

回答

0

例如

Where (values.LocName IsNot Nothing AndAlso values.LocName.Contains(SearchTerm)) OrElse 
     (values.Address IsNot Nothing AndAlso values.Address.Contains(SearchTerm)) 
+0

不,這個解決方案不起作用。我已經嘗試了幾種類似的技術來檢查null值,然後評估它是否爲空。所有這些都會導致LINQ操作返回查詢的所有結果,或者不返回任何結果。這個解決方案沒有返回任何結果,當一個SearchTerm完美工作時,這個操作是針對Linq到SQL版本的「Location」而不是實體運行的。我不理解底層技術如何可能需要這樣一種不同的方法,因爲沒有任何東西可以使這個LINQ查詢工作。 – Brandon 2014-09-03 13:01:22

+0

儘管如此,我認爲使用AndAlso和OrElse是更好的做法。我在VB.net方面也不是很有經驗(主要是.NET世界中的C#),我實際上已經忘記了VB.net世界中的Or/Else不同於&&和||在C#中。 – Brandon 2014-09-03 13:19:24

0

所以,我終於得到了工作的答案是使用ToLower將

SearchTerm = SearchTerm.ToLower 

Return (From values In Location.getData _ 
Where (values.LocName IsNot Nothing And Also values.LocName.ToLower.Contains(SearchTerm) 

我還是想明白了兩兩件事:

  1. 爲什麼是空的檢查需要使用時LINQ to Entity在LINQ to SQL中運行時沒有問題,從不碰到NullReference異常?

  2. 爲什麼LINQ的.Contains在LINQ to SQL中不區分大小寫,但它在這裏?我已經驗證了100%的確定性,使用LINQ to SQL的相同代碼不會拋出NullReference異常,並且不需要處理.Contains作爲區分大小寫的函數(因此SearchTerm的任何套管都將與結果的任何套管相匹配隱含地)。

相關問題