簡體   English   中英

linq where子句中的空值

[英]Null value in linq where clause

我遇到了一個問題,我想返回匹配的結果,如果我要匹配的屬性之一為空,則會出現錯誤。

  if (!string.IsNullOrEmpty(searchString))
  {
      Infos = Infos.Where(
          x =>
          x.FirstName.ToLower().Contains(searchString) ||
          x.LastName.ToLower().Contains(searchString) ||
          x.ContractNum.ToLower().Contains(searchString) ||
          x.VIN.ToLower().Contains(searchString) ||
          x.Claim.InitiatedBy.ToLower().Contains(searchString)
          ).ToList();
  }

例如,如果ContractNumVIN為null,則將引發錯誤。 我不確定如何在linq查詢中檢查其中之一是否為null。

您可以添加顯式的空檢查:

  Infos = Infos.Where(
      x =>
      (x.FirstName != null   && x.FirstName.ToLower().Contains(searchString)) ||
      (x.LastName != null    && x.LastName.ToLower().Contains(searchString)) ||
      (x.ContractNum != null && x.ContractNum.ToLower().Contains(searchString)) ||
      (x.VIN != null         && x.VIN.ToLower().Contains(searchString)) ||
      (x.Claim != null       && x.Claim.InitiatedBy != null && x.Claim.InitiatedBy.ToLower().Contains(searchString))
      ).ToList();

您有多個選項,首先是對null進行顯式檢查,另一個選擇是使用Null傳播運算符。

x.FirstName != null &&  x.FirstName.ToLower().Contains(searchString)

要么

x.FirstName?.ToLower()?.Contains(searchString) == true

但是我建議您使用IndexOf而不是Contains進行不區分大小寫的比較。

就像是:

x.FirstName?.IndexOf(searchString, StringComparison.CurrentCultureIgnoreCase) >= 0)

在比較之前檢查屬性為null或為空是我知道的唯一方法

if (!string.IsNullOrEmpty(searchString))
      {
          Infos = Infos.Where(
              x =>
              (!String.IsNullOrEmpty(x.FirstName) && x.FirstName.ToLowerInvariant().Contains(searchString)) ||
              (!String.IsNullOrEmpty(x.LastName) && x.LastName.ToLowerInvariant().Contains(searchString)) ||
              (!String.IsNullOrEmpty(x.ContractNum) && x.ContractNum.ToLowerInvariant().Contains(searchString)) ||
              (!String.IsNullOrEmpty(x.VIN) && x.VIN.ToLowerInvariant().Contains(searchString)) ||
              (x.Claim != null && !String.IsNullOrEmpty(x.Claim.InitiatedBy) && x.Claim.InitiatedBy.ToLowerInvariant().Contains(searchString))
              ).ToList();
      }

額外:我在Claim屬性上添加了一個檢查,以確保在查看InitiatedBy時它不為null

附加2:使用內置函數IsNullOrEmpty將字符串與""null進行比較,以便使代碼更清晰。

附加3:用於ToLowerInvarianthttps://msdn.microsoft.com/zh-cn/library/system.string.tolowerinvariant ( v= ToLowerInvariant ) ToLowerInvariant ),因此降低操作將起到相同的作用文化。

您可以使用?? 用可接受的值替換它。

   (x.ContractNum??"").ToLower()

我會使用空條件運算符? ,但這將返回可為null的bool? 因此您需要適當地處理。

有關如何執行此操作的一些示例:

x?.FirstName?.ToLower().Contains(searchString) == true;
x?.FirstName?.ToLower().Contains(searchString) ?? false;

將比較邏輯保留在一個位置的另一種方法是使用屬性的子集合並檢查這些屬性:

Infos = Infos.Where(i=> 
   new[] {i.FirstName,i.LastName,i.ContractNum /*etc*/}
   .Any(w=> w?.ToLower().Contains(searchString) ?? false))
   .ToList();

(它確實讀取了所有屬性,但這不應該花費太多性能並獲得很多可維護性)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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