7

datetimeには時間部分があるため、時間部分だけで日時比較が機能しないと人々が言っ​​ていると聞きました。

SQLでは、私は常にこのように日時を比較し、正常に動作します

select * from employee
where convert(varchar,dob,112) > '20111201' // this yyyymmdd format.

LINQ クエリでこれをどのようにシミュレートできますか?

4

2 に答える 2

10

.NET 4 以降を使用している場合は、EntityFunctions.TruncateTimeヘルパー メソッドを使用してください。これにより、このタイプの日時から日付への変換が SQL に変換されます。

from e in EfEmployeeContext
where EntityFunctions.TruncateTime(e.DOB) > new DateTime(2011,12,01);
于 2012-09-13T18:22:47.010 に答える
3

データベース列を表す 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);
于 2012-09-13T18:18:53.000 に答える