2011-07-08 9 views
0

私はEmployeeというテーブルを持っています。テーブルのいくつかのフィールドはCompanyId、SomeDataですLINQ to SQL Null値が返される

私は会社のIDに基づいてMinDomDateをクエリします。

このような何か:

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

} 

一致する企業IDがない場合は、例外をスローしていました。 nullが返される可能性はありますか?一般的に、LINQからSQLへのクエリではnullが返されます。

+3

あなたはそれを試してみる必要があります - あなたが存在しないことを知っているCompanyIDでメソッドを呼び出し、何が起こるかを見てください。 –

+0

私は@Jonに同意します。このような何かがあなた自身のために非常に迅速にテストできました。要素を持たないMax/Min/etcを呼び出すと、InvalidOperationExceptionが発生します。 – 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(); 

} 

あなたの質問に答えるために、私は企業IDのための結果を持っていないクエリがエラーをスローすることを信じています。 Any()メソッドはあなたの友人になります。空のセットで他のメソッドを呼び出すと、エラーがスローされます。

+0

"おそらく"ではありません:{}} .Max(Function(n)n> 0)からconsole.WriteLine(New List Of Int16)エラーが発生します。 OPの場合と同様に、それをテストしてください;-) – Smudge202

+0

:)うん... – Narnian

0

Minは、SQLでNULLを返します。これは予想されます。この問題は、結果をキャストするときにC#で発生します。タイプが非NULL可能である場合は、次のようなエラーが発生します:

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

C#がDateTime(これは、この場合には、あなたがMinを求めているフィールド上の戻り値の型をベースにするためですジェネリック医薬品の仕組み)しかし、このエラーは、型のnull可能なバージョンに結果を型キャストするだけで回避できます!

あなたの元のクエリは、次のように変更します。これは、例外をスローするのではなく、NULL結果が得られます

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

。 IIRCでは、元の型がすでにnullableである場合、型変換は必要ありません。