最近、EF 4.2 から EF 5.0 にアップグレードされたコードがいくつかあります (.Net 4.0 で実行しているため、実際には EF 4.4 です)。クエリの構文を変更する必要があることがわかりました。その理由が知りたいです。問題から始めましょう。
クライアントによって定期的に入力される EventLog テーブルがあります。イベント ログごとに、レポート テーブルにエントリが作成されます。これは、レポート テーブルにまだエントリがないイベント ログを検出するために定期的に実行されるクエリです。EF 4.2 で使用したクエリは次のとおりです。
from el in _repository.EventLogs
where !_repository.Reports.Any(p => p.EventLogID == el.EventlogID)
EF 5.0 にアップグレードしてから、実行時に次のエラーが発生します。
System.NotSupportedException: タイプ 'Namespace.Report' の定数値を作成できません。このコンテキストでは、プリミティブ型または列挙型のみがサポートされています。
結合構文で書き直したところ、問題が解決したことがわかりました。以下は EF 5.0 で機能し、ほぼ同等です。
from eventLog in _repository.EventLogs
join report in _repository.Reports on eventLog.EventlogID equals report.EventLogID into alreadyReported
where !alreadyReported.Any()
最初のクエリの構文/スタイルが混在していることについて意見が分かれている人もいるかもしれませんが、私はその理由にもっと興味があります。EF 4.2 コンパイラが元のクエリの SQL を生成できたのに、EF 5.0 が拒否するのは奇妙に思えます。これは私が見逃している設定ですか、それとも 2 つの間の制約を強化しているだけですか? なぜこうなった?