2010-08-31 27 views
0

我有以下的LINQ代碼:在LINQ查詢處理空字節數組值

docTypes = (from c in context.Citizenships join 
      cdt in context.Citizenship_Document_Types 
         on c.Country_Code equals cdt.Country_Code 
      from cd in context.Citizenship_Documents 
           .Where(cd => cd.Citizenship_Id == c.Citizenship_ID) 
           .DefaultIfEmpty() 
      where c.Citizenship_ID == citizenshipId 
      select new CitizenshipDocument 
    { 
       Id = (int?)cd.Citizenship_Document_Id??-1, 
       CitizenshipId = c.Citizenship_ID, 
       DocumentTypeId = cdt.Citizenship_Document_Type_Id, 
       DocumentTypeName = cdt.Citizenship_Document_Type_Name, 
       DocumentCode = cd.Citizenship_Document_Code.ToArray(), 
       ExpirationDate = cd.Expiration_Date, 
       IssueDate = cd.Issue_Date 
    }).ToList(); 

的問題是,當cd.Citizenship_Document_Code返回null使用.ToArray()時,我得到一個錯誤。 :

對象引用未設置到對象

我如何處理空值的實例?

+0

我建議分割它,所以它不是一個具有不同責任的大代碼。也許在CitizenshipDocument上創建一個新的構造函數或靜態構造函數方法,只需要c和cd。或者,如果這不是一個選項,一個採用c和cd的本地Func,並返回CitizenshipDocument。 – 2010-08-31 03:20:22

回答

1

你會在LINQ查詢中處理空值,就像你在其他地方處理它們一樣。不要取消引用空值!例如:

docTypes = (from c in context.Citizenships join 
      cdt in context.Citizenship_Document_Types 
      on c.Country_Code equals cdt.Country_Code 
      from cd in context.Citizenship_Documents.Where(
       cd => cd.Citizenship_Id == c.Citizenship_ID).DefaultIfEmpty() 
      where c.Citizenship_ID == citizenshipId 
      select new CitizenshipDocument 
      { 
       Id = (int?)cd.Citizenship_Document_Id??-1, 
       CitizenshipId = c.Citizenship_ID, 
       DocumentTypeId = cdt.Citizenship_Document_Type_Id, 
       DocumentTypeName = cdt.Citizenship_Document_Type_Name, 
       DocumentCode = cd.Citizenship_Document_Code == null ? 
        null : 
        cd.Citizenship_Document_Code.ToArray(), 
       ExpirationDate = cd.Expiration_Date, 
       IssueDate = cd.Issue_Date 
      }).ToList(); 
+0

謝謝。我以爲我嘗試過這種方式,並且失敗了。我一定有一些其他的語法錯誤。 – 2010-08-31 04:13:59

0

考慮使用類似下面的擴展方法處理空值與適當的空對象:

public static T ToNonNull<T>(this T input) where T : class, new() 
{ 
    if (input != null) 
    { 
    return input; 
    } 
    return new T(); 
} 

用法是這樣的:

DocumentCode = cd.Citizenship_Document_Code.ToNonNull().ToArray() 

你可以如果您不想使用通用的擴展名,也可以使用特定的ToNonNull()擴展名。