簡體   English   中英

linq where子句和count導致null異常

[英]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](IEnumerable
1.MoveNext()
at System.Linq.Enumerable.Count[TSource](IEnumerable
1.MoveNext()
at System.Linq.Enumerable.Count[TSource](IEnumerable
1 source)

我應該如何處理這個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM