web-dev-qa-db-ja.com

LINQ to Entitiesは 'System.TimeSpan Subtract(System.DateTime)'メソッドを認識しません

現在の日付の60日、3​​0日、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();

しかし、このクエリでエラーが発生しました。

enter image description here

私は無知です。助けてください。

34
Ragesh S

最も簡単なアプローチは、境界を解決することです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を超える」に分類しようとする場合は、何らかの形式のグループ化を使用する必要があります。

36
Jon Skeet

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)
54
scartag

これは動作するはずです:

using System.Data.Entity.SqlServer;

where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60
4
Dmitry Stepanov

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;
3
Jon Schneider