2

以下の2つの例のようなクエリがいくつかありました。

// Example 1:
var dataSeries = (from d in DataSeries
                  where d.Symbol == symbol
                  select d).FirstOrDefault();

// Example 2:
return Markets.Where(m => m.DataSeries == dataSeries).ToArray();

「データベースからモデルを更新...」を実行するまでは、これは問題なく機能していました。今、私はNotSupportedExceptionを取得しています:

タイプ'MyTest.Symbol'の定数値を作成できません。このコンテキストでは、プリミティブ型または列挙型のみがサポートされています。

はい、その記号とdを確認しました。シンボル(およびm。DataSeriesdataSeries)は同じタイプです。

はい、次のようにP/Fキーの関係を使用するようにクエリを変更できます。

var dataSeries = (from d in DataSeries
                  where d.Symbol.Id == symbol.Id
                  select d).FirstOrDefault();

しかし、オブジェクトの関係が正常に機能しているときに、すべてのコードをP/Fキーの関係に変更する必要はありません。

質問:最初の例を再び機能させるにはどうすればよいですか?

4

2 に答える 2

2

データベースに対してwhere実行されるLINQクエリにそのような句を記述することはできません。コードはSQLに変換され、データベースエンジンで実行されることに注意してください。

では、最初の例では、Entity Frameworkは複合型の2つのインスタンスを比較する方法をどのように知るのでしょうMyTest.Symbolか?このような比較に適したSQLがないため、EFは単純にできません。

where句には、DBエンジンが理解できるものを指定する必要があります。これは、基本的に、プリミティブ型( 、、...)WHEREのIDに基づくSQL句になります。intbigint

を使用してデータベースからすべてのデータをフェッチし、メモリ内の結果リストに句.ToList()を適用できるため、句をSQLに変換する必要はありません。wherewhere

Markets.ToList().Where(m => m.DataSeries == dataSeries);

ただし、メモリの大量使用(すべてがコンテキストにロードされる)、パフォーマンスの低下など、DBサーバーのすべての利点が失われます。

実際にはwhere、DBに対してを実行する必要があります。つまり、比較にはプリミティブ型を使用する必要があります。

Markets.Where(m => m.DataSeries.ID == dataSeries.ID);
于 2013-02-06T15:38:46.710 に答える
1

EFはLINQクエリでのオブジェクト比較をサポートしておらず、SQLステートメントに変換する方法がわからないため、この例は機能しません。

最初にDataSeries.ToList()を使用してすべてのDataSeriesをメモリにフェッチした場合でも、シンボルがロードされたリストに属しているか、Equalメソッドをオーバーライドする必要がない限り、比較d.Symbol==シンボルは機能しません。これは、デフォルトでは、2つのオブジェクトが同じインスタンスを参照している場合にのみ等しいためです。

于 2013-02-06T14:57:15.787 に答える