2009-07-06 15 views
40

助けてください。 linqクエリで比較のためにDATEまたはDATETIMEを使用する方法を理解しようとしています。EFクエリで日付比較を実行するにはどうすればよいですか?

例: 今日は前に開始する人のためのすべての従業員の名前を望んでいた場合、私は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:指定された型のメンバ '日付' はエンティティへのLINQでサポートされていません。初期化子、エンティティメンバー、エンティティナビゲーションプロパティのみがサポートされています。

答えて

18

これでうまくいくはずです。例外を引き起こしたクエリの別の部分がないことは確かですか?私は私のコードで

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

形式のクエリの複数のインスタンスを持っています。

+1

これは働いていた:StartDateColumn <= GETDATE()//今日 これはしなかったWHERE:WHERE StartDateColumn。日付<= GETDATE()//今日 私の声明には日付がありました。 ありがとうございます。 kam –

+6

これは問題ではありません - e.AsofDate.Dateは問題です(両側の日付部分のみを比較してください)... – Dani

2

'DateTime'を渡しているときに、'Date'というエラーメッセージが表示されるのが不思議です。 'StartDateColumn'は実際には'Date'で、データベースには'DateTime'ではありませんか?それは比較を混乱させるかもしれません...

9

これは、データベースの日付がNULLに設定されている可能性があります。これを試してください:あなたは今日をチェックしたい場合

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

".Value"は私の誕生日でした –

5

あなたは時間がないとdatetime型を作成することができます.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(); 
2

この試してみてください。

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") ; 
1

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

以下の例では、groupidと一致し、自分のレコードのStopDateが現在の日付/時刻のスタンプより大きいかどうかを確認しています。

私はこのコードを現在使用していますが、魅力的です。

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

魅力的な作品...

1

日付値を格納し、クエリでその変数を使用するようにローカル変数を使用します。

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

8

あなたが買ってあげるここでこの

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日付のレコードは、今日の日付レコードを取得します。

0

。日付は動作しませんでしたが、。日でした。

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(); 
+1

これはおそらく***例えば、Jan 01&Feb 01は、実際にはリアルタイムで異なる日があるにもかかわらず、同じ「Day」コンポーネント値を持っています。 – JoeBrockhaus

63

時間部分のトリミングには、クラス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/

+0

苦労していました。これは、後でこれを見つけるために拡張メソッドを使うことにしました。- –

+6

これは答えでした。 –

+3

EntityFunctionsは廃止され、DbFunctionsに置き換えられました。これを反映する答えは –

0

あなたはこのようにnull値をチェックしていることを確認します。

'(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();' 
関連する問題