[英]linq where clause and count result in null exception
除非p.School.SchoolName結果為null,否則下面的代碼有效,在這種情況下,它會導致NullReferenceException。
if (ExistingUsers.Where(p => p.StudentID == item.StaffID &&
p.School.SchoolName == item.SchoolID).Count() > 0)
{
// Do stuff.
}
ExistingUsers是一個用戶列表:
public List<User> ExistingUsers;
這是stacktrace的相關部分:
System.NullReferenceException:未將對象引用設置為對象的實例。
在System.Linq.Enumerable.WhereListIterator
1.MoveNext()
at System.Linq.Enumerable.Count[TSource](IEnumerable1.MoveNext()
at System.Linq.Enumerable.Count[TSource](IEnumerable1.MoveNext()
1 source)
at System.Linq.Enumerable.Count[TSource](IEnumerable
我應該如何處理這個where子句?
首先十分感謝。
我懷疑p.School
為空,不SchoolName
。 只需在訪問SchoolName
之前添加一個空檢查。 另外,使用Any()
來檢查是否有任何結果而不是Count() > 0
除非你真的需要計數。 這表現得更好,因為並非所有項都被迭代(如果存在的話)。
var result = ExistingUsers.Where(p => p.StudentID == item.StaffID
&& p.School != null
&& p.School.SchoolName == item.SchoolID)
.Any();
if (result) { /* do something */ }
對於所有數據庫可空列,我們應該添加空檢查或進行簡單的比較a == b
而不是a.ToLower() == b.ToLower()
或類似的字符串操作。
我的觀察如下:
當它們通過Enumerable LINQ Query迭代以與輸入字符串/值進行比較時,任何空值(數據庫列)及其上的操作都會引發異常,但Enumerable變為NULL,盡管查詢不為null。
如果您想獲得空值(所有學生,是否有學校)使用左連接。
在MSDN上有一個很好的例子
如果我沒記錯的話(目前不在我的開發人員PC上並且無法使用Reflector檢查),使用==
運算符會導致調用實例實現 string.Equals(string)
,而不是靜態實現String.Equals(string, string)
。
假設你的問題是由於SchoolName
為null,正如你的建議,試試這個:
if (ExistingUsers.Where(
p => p.StudentID == item.StaffID
&& String.Equals( p.School.SchoolName, item.SchoolID)).Count() > 0)
{
// Do stuff.
}
當然,其他答案的評論也是如此:
Any()
而不是Count() > 0
通常會表現得更好 p.School
為null,則需要額外檢查 希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.