2010-12-28 8 views
4

DateTimeフィールドを日付範囲だけでなく時間範囲でも検索できるようにします。たとえば、「5月のすべてのレコードを取得すると、午後1時から3時の間に作成されます。私は、生成しているよSQLは次のとおりです。Linq to SQLを使用してSQL 2008の日付の時間部分のみを検索する

WHERE CreatedOn BETWEEN '05/01/2010' AND '06/01/2010' AND CONVERT(time(4), CreatedOn) BETWEEN '01:00 PM' AND '03:00 PM' 

私はそこに私を得るためにラムダ式を取得する方法を見つけ出すように見えることはできません。誰か手掛かりがありますか?私は自分のプロジェクトにSystem.Linq.Dynamicを持っています。あなたは[並べ替え句として文字列を渡すことができる方法と同様に、私は次のように::

results = results.Where("CONVERT(time(4), OccurredOn) BETWEEN '{0}' AND '{1}'", Criteria.OffenseTimeStart, Criteria.OffenseTimeEnd); 

をどこ方法で同じことを行うことができるかもしれないと思った。しかし、それはSystem.Linq.Dynamicで例外がスローされます。誰もが何か指摘している?

助けてよろしくお願いします!ここに私の作業コードの抜粋です。私はタイムスパンと私の時間基準のプロパティを公開:

  if (Criteria.OffenseDateStart.HasValue) 
       results = results.Where(o => o.OccurredOn >= Criteria.OffenseDateStart); 

      if (Criteria.OffenseDateEnd.HasValue) 
       results = results.Where(o => o.OccurredOn <= Criteria.OffenseDateEnd); 

      if (Criteria.OffenseTimeStart.HasValue) 
       results = results.Where(o => o.OccurredOn.TimeOfDay >= Criteria.OffenseTimeStart); 

      if (Criteria.OffenseTimeEnd.HasValue) 
       results = results.Where(o => o.OccurredOn.TimeOfDay <= Criteria.OffenseTimeEnd); 

答えて

2

私はあなたが「の間」を行うことができるとは思わないが、あなたのようなLINQクエリ書くことができます:

where (x.CreatedOn.Date >= myDate.Date && x.CreatedOn.Date <= myDate2.Date) 
    && (x.CreatedOn.TimeOfDay >= TimeSpan.Parse("13:00") && x.CreatedOn.TimeOfDay <= TimeSpan.Parse("15:00")) 
+0

生成SQLはもう少し冗長ですが、魔法のように動作します!私はTimeSpanのSQL変換があるとは思わなかった...しかし、私は間違っていたと思う。ありがとう! –

+0

私はNHibernate 3.0で生成されたものはより良いと思うが、atleast作品:)喜んで助けてください。 – Phill

0

このような何かを?

results = results.Where(x => x.OccurredOn.Date >= Criteria.OffenseDateStart.Date 
     && x.OccurredOn.Date <= Criteria.OffenseDateEnd.Date 
     && x.OccurredOn.TimeOfDay >= Criteria.OffenseTimeStart.TimeOfDay 
     && x.OccurredOn.TimeOfDay <= Criteria.OffenseTimeEnd.TimeOfDay); 

OccurredOnOffenseDateStartOffenseDateEndOffenseTimeStartOffenseTimeEndをすべてDateTimeとして入力されていると仮定。)