4

これは動作します

DateTime dtYesterday = DateTime.Now.AddDays(-1);
data = data.Where(d => d.CreatedTime <= dtYesterday);

しかし、これはしません

data = data.Where(d => d.CreatedTime <= DateTime.Now.AddDays(-1));

EFはそれをSQLに変換できないためです。それはいいです。

DateTime.Now.AddDays(-1)しかし、好奇心から、SQLに変換する前にの値を評価するように強制する方法はありますか?

これに似た構文があるかどうか疑問に思いますか?

data = data.Where(d => d.CreatedTime <= ForceEvaluate(DateTime.Now.AddDays(-1)));
4

1 に答える 1

1

IQueryable<T>との違いはIEnumerable<T>、クエリを実行するクエリ エンジン (つまり RDBMS) に提示するためにプログラマ (つまり、ユーザー) が記述した式を前者が保持することです。それが評価する必要がある関数であることを理解することはうまくいきDateTime.Now.AddDays(-1)ますが、使い慣れた簡単に認識できる構文を使用したシンプルで直接的なソリューションと比較すると、魔法が多すぎます。

DateTime dtYesterday = DateTime.Now.AddDays(-1);
data = data.Where(d => d.CreatedTime <= dtYesterday);

推測する必要があると、RDBMS などに関数を渡す機会がプログラマーから奪われDateTime.Now.AddDays(-1)ます。現在のデータベースの日付/時刻がアプリケーション サーバーとは異なり、異なる行セットになる可能性があることは完全に考えられます。一方、ForceEvaluate構文を導入しても意味がありません。評価する式をマークする必要がある場合は、おなじみの方法でマークする必要があるためです (上に貼り付けたコードを参照してください)。

于 2012-12-03T02:54:42.267 に答える