datetimeには時間部分があるため、時間部分だけで日時比較が機能しないと人々が言っていると聞きました。
SQLでは、私は常にこのように日時を比較し、正常に動作します
select * from employee
where convert(varchar,dob,112) > '20111201' // this yyyymmdd format.
LINQ クエリでこれをどのようにシミュレートできますか?
datetimeには時間部分があるため、時間部分だけで日時比較が機能しないと人々が言っていると聞きました。
SQLでは、私は常にこのように日時を比較し、正常に動作します
select * from employee
where convert(varchar,dob,112) > '20111201' // this yyyymmdd format.
LINQ クエリでこれをどのようにシミュレートできますか?
.NET 4 以降を使用している場合は、EntityFunctions.TruncateTime
ヘルパー メソッドを使用してください。これにより、このタイプの日時から日付への変換が SQL に変換されます。
from e in EfEmployeeContext
where EntityFunctions.TruncateTime(e.DOB) > new DateTime(2011,12,01);
データベース列を表す DateTime 構造体の操作は SQL に変換されないことに注意してください。したがって、次のようなクエリを書くことはできません。
from e in EfEmployeeContext
where e.DOB.Date > new DateTime(2011,12,01);
... e.DOB はデータベースの DOB 列を表し、EF は Date サブプロパティを変換する方法を知らないためです。
ただし、希望する日付に応じて簡単な回避策があります。
2011 年 12 月 1 日に生年月日を持つすべての従業員と、その日以降に生まれた従業員を含めたい場合は、単純に次のクエリを実行します。
from e in EfEmployeeContext
where e.DOB > new DateTime(2011,12,01);
2011 年 12 月 1 日以降に生まれた従業員のみを含める場合は、次のクエリを実行します。
from e in EfEmployeeContext
where e.DOB >= new DateTime(2011,12,02);
つまり、比較対象の定数またはリテラル DateTime を意味する基準は、必要に応じて設定できます。where述語内のDB列を表すプロパティに根本的な変更を加えることはできません。つまり、ある DateTime 列を別の DateTime 列の射影と比較することはできません。たとえば、次のようになります。
//get all employees that were hired in the first six months of the year
from e in EfEmployeeContext
where e.HireDate < new DateTime(e.HireDate.Year, 7, 1);