38

現在の日付で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();

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

ここに画像の説明を入力

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

4

4 に答える 4

60

EntityFunctions.DiffDaysメソッドを使用できます

EntityFunctions.DiffDays(product.EventDate, DateTime.Now) //this will return the difference in days

アップデート

EntityFunctions は廃止されたため、代わりに DBFunctions を使用する必要があります。

System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now)
于 2013-03-07T06:16:58.517 に答える
39

最も簡単な方法は、クエリを実行するに境界を調べることです。

// 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
            ...

現在のクエリは実際には意味をなさないことに注意してください。各「or」句は、指定された計算が値以下であり同じ値以上であることを示しているためです。単純な「等しい」が必要な場合は、それを使用してください。そうでない場合は、何をしようとしているのか明確ではありません。

値を「20 未満」、「20 ~ 30」、「30 ~ 60」、「60 以上」に分類しようとしている場合は、何らかの形式のグループ化を使用する必要があります。

于 2013-03-07T06:16:24.687 に答える