2011-07-08 105 views
0

我有一個名爲Employee的表。某些表中的字段是CompanyId,SomeDataLINQ to SQL將返回空值

我想查詢基於companyId的Min SomeDate。

事情是這樣的:

public DateTime? GetMinDateForCompany(long CompanyId) 
{ 
     dataContext.Employees.Where(emp => emp.CompanyID == companyId).Select(emp => emp.SomeDate).Min(); 

} 

如果沒有匹配的companyId,會拋出異常。是否有可能返回null。一般情況下,何時會返回一個LINQ-to-SQL查詢的空值。

+3

您應該嘗試一下並看看 - 只需使用您知道不存在的CompanyID調用該方法並查看會發生什麼。 –

+0

我同意@Jon。像這樣的事情你可以爲自己測試得很快。不使用元素調用Max/Min/etc會導致InvalidOperationException:console.WriteLine(新列表(Of Int16)()從{} .Max(Function(n)n> 0)) – Smudge202

回答

2

你應該調用Any()方法來確保你有結果。否則,你會在沒有結果的情況下調用Min(),這會引發錯誤。

public DateTime GetMinPayrollDateForCompany(long CompanyId) 
{ 
    if (dataContext.Payrolls.Any(proll => proll.CompanyID == companyId)) 
     return dataContext.Payrolls.Where(proll => proll.CompanyID == companyId).Select(proll => proll.PayrollDate).Min(); 
    else 
     return new DateTime(); 

} 

回答您的問題,我相信,一個沒有結果companyId查詢會拋出一個錯誤。 Any()方法將成爲你的朋友。在空集上調用其他方法會拋出錯誤。

+0

不是「可能」。它確實會導致錯誤。與OP一樣,測試它;-) – Smudge202

+0

:)是啊是啊... – Narnian

0

Min將在SQL中返回NULL。這是預料之中的。在C#中,當您投射結果時會出現問題。如果類型是不可爲空,你會得到這樣一個錯誤如下:

The null value cannot be assigned to a member with type System.DateTime which is a non-nullable value type. 

這是因爲C#會根據你所要求的Min領域的返回類型,在這種情況下DateTime(這是泛型如何工作)。但是,我們可以通過簡單地將結果轉換爲可空類型的結果來避免此錯誤!

原始查詢會更改爲以下:

dataContext.Payrolls 
    .Where(proll => proll.CompanyID == companyId) 
    .Min(proll => (DateTime?)proll.PayrollDate) 

這會給一個NULL結果,而不是拋出異常。 IIRC,如果您的原始類型已經可以爲空,則不需要類型轉換。