6

更新:MySqlログを読み間違えたため、元の質問は無効でした。ごめん。更新された以下を参照してください。

LINQクエリを使用しています:

var homework = ctx.Threads.Where(t => t.ClassName == "10L"
                                   && t.EndDate != null
                                   && t.StartDate <= DateTime.Now
                                   && t.EndDate > DateTime.Now)
                          .OrderByDescending(o => o.EndDate)
                          .FirstOrDefault();

これにより、SQL(MySQL 5.5.14)が作成されます。

SELECT
`Project1`.`id`,
`Project1`.`title`,
`Project1`.`startdate`,
`Project1`.`enddate`,
`Project1`.`class`,
`Project1`.`body`,
`Project1`.`threadtype`
FROM (SELECT
     `Extent1`.`id`,
     `Extent1`.`title`,
     `Extent1`.`startdate`,
     `Extent1`.`enddate`,
     `Extent1`.`class`,
     `Extent1`.`body`,
     `Extent1`.`threadtype`
     FROM
     `threads` AS `Extent1`
     WHERE (((`Extent1`.`class` = '10L')
         AND (`Extent1`.`enddate` IS NOT NULL))
         AND (`Extent1`.`startdate` <= (NOW())))
         AND (`Extent1`.`enddate` > (NOW())))
AS `Project1`
ORDER BY `Project1`.`enddate` DESC
LIMIT 1

LINQ to EFはどのようにしてNOW()関数を使用することを知っていますか?確かに私はそれをDateTime値で通常の構造体に渡しているだけですか?

LINQクエリで変数を使用var now = DateTime.Now;してから使用すると、日付はリテラルとして渡されます。nowどうしたの?

4

3 に答える 3

4

LINQ-to-whateverは、式ツリーを解析して.NETコードから適切なSQL言語に変換することで動作します。これにより、クエリはクライアント側ではなくデータベース側で可能な限り処理できるようになります。結果として、あなたが言うとき:

... myField <= DateTime.Now

パーサーはDateTime.Now、コードを可能な限り適切なSQL言語に変換するために、式参照を評価せずに使用します。これにより、LINQが効率的に機能しますが、副作用として、クエリ内のすべてが式として解釈され、適切なSQLコードに変換しようとします。代わりに変数に格納すると、次のようになります。

var now = DateTime.Now;

値はすぐに評価されてに格納されnow、その値は式の代わりに文字通りクエリで使用されます。

于 2012-05-21T21:38:41.900 に答える
3

DateTime.Nowは関数(Nowプロパティのゲッター)であるため、式ツリーを作成しようとすると、linq2EFはそれを関数として認識します。これは.ToString()、link2EFでどのように機能するかを言うようなものです。また、一時変数から使用する場合は、結果を.ToString()一時変数に保存する場合のように、一時変数として扱われ、最終的な変更は出力に影響しません。

于 2012-05-21T21:38:57.870 に答える
0

良い質問と答え。これをMicrosoftSQLServer 2008 R2を使用する環境に追加したかったのですDateTime.Nowが、LINQ to Entitiesクエリで参照すると、次のSQL式が生成されます。

CAST( SysDateTime() AS datetime2)

NOW()これはMySQLでの生成に似ていると思うので、基盤となるデータベースに関係なく同じ動作が見られます。

もちろん、データベースサーバーではなく、LINQコードが実行されている現地時間を必要とする場合、この動作は問題になる可能性があります。ローカル変数に割り当てDateTime.NowてLINQ式で使用する回避策は、予想どおりMSSQLで正常に機能しました。

于 2012-08-20T22:27:33.930 に答える