現在の日付の60日、30日、20日でデータベースのレコードを選択しようとしています。
以下のこのクエリをご覧ください。
var uploads = (
from files in _fileuploadRepository.Table
join product in _productRepository.Table on files.Event equals product.Id
where
(
product.EventDate != null &&
(product.EventDate.Subtract(DateTime.Now).Days <= 60 && product.EventDate.Subtract(DateTime.Now).Days >= 60) ||
(product.EventDate.Subtract(DateTime.Now).Days <= 30 && product.EventDate.Subtract(DateTime.Now).Days >= 30) ||
(product.EventDate.Subtract(DateTime.Now).Days <= 20 && product.EventDate.Subtract(DateTime.Now).Days >= 20))
&&
files.IsSkiped == false
select files;
).ToList();
しかし、このクエリでエラーが発生しました。
私は無知です。助けてください。
最も簡単なアプローチは、境界を解決することですbeforeクエリを実行します。
// Only evaluate DateTime.Now once for consistency. You might want DateTime.Today instead.
DateTime now = DateTime.Now;
DateTime nowPlus60Days = now.AddDays(60);
DateTime nowPlus30Days = now.AddDays(30);
DateTime nowPlus20Days = now.AddDays(20);
var query = ...
where product.EventDate <= nowPlus60Days
...
現在のクエリは実際には意味をなさないことに注意してください。各「または」d句は、指定された計算が値以下であると述べているため、and以上同じ値。単純な「等しい」が必要な場合は、それを使用します。そうでない場合、あなたが何をしようとしているかは明らかではありませんare。
値を「20未満」、「20〜30」、「30〜60」、「60を超える」に分類しようとする場合は、何らかの形式のグループ化を使用する必要があります。
EntityFunctions.DiffDays
メソッドを使用できます
EntityFunctions.DiffDays(product.EventDate, DateTime.Now) //this will return the difference in days
[〜#〜] update [〜#〜]
EntityFunctionsは廃止されたため、代わりにDBFunctionsを使用する必要があります。
System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now)
これは動作するはずです:
using System.Data.Entity.SqlServer;
where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60
Scartagの答えに追加するには、
DbFunctions.DiffDaysのMSDNドキュメント では、DiffDays()によって返される値が負になるかどうか、およびいつ負の値になるかについて直接言及していないため、ここでその情報を提供すると思いました。
引数1の日付が引数2の日付よりも大きい(つまり、将来の)場合、結果は負になります。
たとえば、現在の日付に対して過去と未来の両方の値を持つことができるnull以外のフィールドDeliveries
を持つテーブルScheduledDeliveryDate
を指定すると、このクエリは現在の日時から2日以内の配達日時(過去と未来の両方):
DateTime now = DateTime.Now;
var results = from d in Deliveries
where (DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) < 2
&& DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) > -2)
select d;