web-dev-qa-db-ja.com

EFクエリで日付比較を実行するにはどうすればよいですか?

助けてください。 linqクエリでの比較にDATEまたはDATETIMEを使用する方法を見つけようとしています。

例:今日より前に開始した人のすべての従業員名が必要な場合は、SQLで次のようにします。

SELECT EmployeeNameColumn
FROM EmployeeTable
WHERE StartDateColumn.Date <= GETDATE() //Today

しかし、linqはどうですか?

DateTime startDT = //Today

var EmployeeName =  
from e in db.employee
where e.StartDateColumn <= startDT 

上記のWHEREは機能しません:

例外の詳細:System.NotSupportedException:指定された型メンバー 'Date'は、LINQ to Entitiesではサポートされていません。初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされています。

47
Kam

それはうまくいくはずです。例外をトリガーしたクエリの別の部分がないと確信していますか?フォームのクエリのインスタンスがいくつかあります

var query = from e in db.MyTable
            where e.AsOfDate <= DateTime.Now.Date
            select e;

私のコードで。

18
jason

時間部分のトリミングには、クラスDbFunctionsを使用します。

using System.Data.Entity;

var bla = (from log in context.Contacts
           where DbFunctions.TruncateTime(log.ModifiedDate) 
                              ==  DbFunctions.TruncateTime(today.Date)
           select log).FirstOrDefault();

ソース: http://social.msdn.Microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

76
Mandeep Janjua

データベース内の日付がnull値になる可能性があります。これを試して:

var EmployeeName =
from e in db.employee
where e.StartDateColumn.Value <= startDT 
10
Shiraz Bhaiji

このような状態を確認できます

var nextDay = DateTime.Today.AddDays(1);

var query = from e in db.MyTable
            where e.AsOfDate >= DateTime.Today && e.AsOfDate < nextDay 
            select e;

今日(00:00:00)とtommorow(00:00:00)の間にチェックを行うと、AsOfDateの日付のレコードが取得されます。

8
Ejaz

.Dateは使用できません

今日を確認したい場合は、時間なしで日時を作成できます

DateTime myDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
var e = (from mds in myEntities.Table
         where mds.CreateDateTime >= myDate
         select mds).FirstOrDefault();
5
Ane

これを試して:

DateTime dd = DateTime.Parse("08/13/2010 00:00:00");
var data = from n in ContributionEligibilities
           where n.ModifiedDateTime.Date >= DateTime.Parse("08/13/2010").Date
           select n; 
data.Dump("Result") ;
2
Yousuf Qureshi

'Date'を渡すときに、'DateTime'というエラーメッセージに興味があります。データベース内の'StartDateColumn'ではなく、'Date'が実際に'DateTime'である可能性がありますか?それは比較を台無しにするかもしれません...

2
David Hedlund

ローカル変数を使用して日付値を保存し、クエリでその変数を使用します。

DateTime today = DateTime.Now.Date; from scheme in context.schemes where scheme.EndDate > today select scheme

1
Niraj

LinqDataSourceを使用していますが、日付比較を含むクエリを取得してエラーなしで実行するのに問題がありました。答えは、WhereAddParameters関数を使用し、テスト値を厳密に型指定されたパラメーターとして追加することです。

Groupidを照合し、レコードのStopDateが現在の日付/時刻スタンプ以上であるかどうかを確認する次の例を参照してください。

現在、このコードフラグメントを使用していますが、これは魅力のように機能します。

LinqCampaigns.WhereParameters.Add("StopDate", System.Data.DbType.Date, DateTime.Now.ToString())
LinqCampaigns.Where = "GroupId = " & myGrp & " &&  " & "StopDate >= @StopDate"

チャームのように機能します。..

1
Les

このようにヌル値を確認してください:

 '(from mm in _db.Calls 
   where mm.Professionnal.ID.Equals(proid)
   && mm.ComposedDate.HasValue &&
   (mm.ComposedDate.Value >= datemin) && (mm.ComposedDate.Value <= date)
   select mm).ToArray();'
0
isambert

.Dateは機能しませんでしたが、。Dayは機能しました。

var query = from o in Payments
    where o.Order.OrderDate.Day != o.PaymentDate.Day
    orderby o.Order.OrderDate
    select new
    {
     o.Order.OrderID,
     o.Order.OrderDate,
     o.PaymentDate,      
     o.Order.FirstName,
     o.Order.LastName,
     o.Order.CustomerID
    };


query.Dump();
0
ADBatBWD