我試圖在LinqPad中編寫Linq-To-SQL查詢來幫助將用戶從舊錶遷移到新表。此遷移的一部分是將所有地址存儲在單獨的表中。我使用下面的查詢,以確定是否用戶的地址在新表中存在(所以我沒有重複的條目):Linq-to-SQL拋出NullReferenceException,儘管檢查爲空參數
var addresses = from a in Addresses where ((u.Street_address == null && a.Street1 == null) || (u.Street_address != null && a.Street1 != null && a.Street1.ToLower() == u.Street_address.ToLower()))
&& ((a.City == null && u.City == null) || (a.City != null && u.City != null && a.City.ToLower() == u.City.ToLower()))
&& ((a.State == null && u.State == null) || (a.State != null && u.State != null && a.State.ToLower() == u.State.ToLower()))
&& ((a.Zip == null && u.Zipcode == null) || (a.Zip != null && u.Zipcode != null && a.Zip.ToLower() == u.Zipcode.ToLower()))
select a;
在這裏,「U」代表的老用戶。舊錶中的某些地址包含Street_address,City,State和/或Zipcode的空條目。此外,一些地址是重複的,除了套管(因此ToLower())。
儘管在查詢中檢查了空參數,但如果任何用戶的地址參數爲空,我仍然會收到NullReferenceException。
我做錯了什麼?還是有更好的方法來完成我所需要的?
String.Equals似乎不適用於Linq-to-SQL。您將得到以下異常:「NotSupportedException:Method'布爾等於(System.String,System.String,System.StringComparison)'不支持對SQL的轉換。」我也嘗試使用String.IsNullOrEmpty()作爲空檢查,但我得到了相同的錯誤信息 –
看看我的修訂答案 - 你得到的錯誤信息是一個好兆頭,這意味着解決方案可能更容易! :-) –
謝謝!這工作。真正有趣的是在查看生成的SQL查詢之後,String.Equals()生成的查詢類似於我原先沒有使用ToLower()方法調用的查詢。基本上,它檢查不爲空,然後檢查是否相等。所以只需使用u.Street_address == a.Street1是不夠的,你還必須檢查null。我相信那是因爲SQL不能使用=來比較NULL。我不明白的是爲什麼==不被評估爲String.Equals()? –