web-dev-qa-db-ja.com

Linq to EntityFramework DateTime

私のアプリケーションでは、Entity Frameworkを使用しています。

私のテーブル

_-Article
-period
-startDate
_

=> DateTime.Now > startDate and (startDate + period) > DateTime.Nowに一致するレコードが必要です

私はこのコードを試しましたが、今は動作しています

_Context.Article
    .Where(p => p.StartDate < DateTime.Now)
    .Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now)
_

コードを実行すると、次の例外が発生します

LINQ to Entitiesは 'System.DateTime AddDays(Double)'メソッドを認識せず、このメソッドはストア式に変換できません。

99
Yucel

LINQ to Entity Frameworkを使用する場合、Where句内の述語はSQLに変換されます。意味のあるDateTime.Add()のSQLへの変換がないため、このエラーが発生しています。

簡単な回避策は、最初のWhereステートメントの結果をメモリに読み込み、LINQ to Objectsを使用してフィルタリングを終了することです。

Context.Article.Where(p => p.StartDate < DateTime.Now)
               .ToList()
               .Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now);

.NET 4.0を使用している場合は、 EntityFunctions.AddDays メソッドを試すこともできます。

Context.Article.Where(p => p.StartDate < DateTime.Now)
               .Where(p => EntityFunctions.AddDays(p.StartDate, p.Period)
                   > DateTime.Now);

注:EF 6 雪が降る - System.Data.Entity.DbFunctions.AddDays

185
Justin Niessner

これがその最後の答えが示唆しようとしていたことだと思いますが、p.startdat(sqlステートメントに変換できないもの)に日を追加しようとするのではなく、なぜsqlと同等のものをしないのですか:

var baselineDate = DateTime.Now.AddHours(-24);

something.Where(p => p.startdate >= baselineDate)
87
andrew

DateTime.Nowから2日を引く方法はどうですか:

Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate > DateTime.Now.Subtract(new TimeSpan(2, 0, 0, 0)))

正直に言うと、あなたが何を達成しようとしているのか分かりませんが、これはうまくいくかもしれません

3
TimC

式をSQLに変換する必要がある場合は、使用してみてください。

System.Data.Entity.Core.Objects.AddDaysメソッド。

実際には廃止とマークされていますが、動作します。 System.Data.Entity.DbFunctions.AddDaysに置き換える必要がありますが、見つかりません...

2
bubi