ビューを含むEntity Frameworkを使用しています。そして私はクエリを持っています:
var data = this.context.vwRevenues
.Where(x => x.revenue >= 0);
.OrderByDescending(x => x.year)
.ThenByDescending(x => x.month)
.Take(10)
.ToList();
このクエリはエンティティのセットを返しますが、1番目のエンティティは5番目に等しいです。
data[0] == data[4] // true
このクエリのSQLスクリプトをSQLトレーサーから取得してSQL Management Studioに実行すると、異なるレコードが返されます。
@ Giovaneによる回答
ビューを処理するEntity Frameworkのシステムでも同じ問題が発生しました。 ROW_NUMBER()OVER()SQLを使用して一意の値を持つ列を作成してみてくださいが、機能しませんでした
私は同じことをしましたが、それを機能させるには、EDMXモデルを開いて、この列をエンティティキーとして選択する必要があります
その後、動作します
これに関する非常に良い記事があります
最も重要な記事は次のとおりです。
エンティティモデルにビューを含める場合、モデルは最初のnull不可の列を主キーとして使用するようです(主キーで使用されるすべての列はnull可能ではない)。
あなたがする必要があるのは:context.viewname.AsNoTracking().Where(x => x.ColumnName != null);
Entity Frameworkがビューを処理するシステムでも同じ問題が発生しました。 ROW_NUMBER()OVER()SQLを使用して一意の値を持つ列を作成してみてくださいが、機能しませんでした。
さらにフィールド、ビューの別のテーブルのFKを挿入する必要があります。これにより、エンティティEntityKeyMembers Elimiteの追加トレーニングとして追加できるようになり、繰り返しの問題が発生します。
したがって、このような状況でも問題が解決しない場合の解決策は、テーブルのEntityKeyを形成するフィールドのMEMBERSになるようにFK列を挿入することです。
ビューで、次のように最初のレコードをnull以外の値に変換してみてください。
isnull(ROW_NUMBER() OVER (ORDER BY "Column"), 0) AS Row
これは、自動的に主キーになることができることをEntity Frameworkに示します。
Edmxを更新せず、任意のキーを列&&に設定したくない場合
ビューレコードを更新したくない場合(レコードの取得のみ)、以下のコードを使用して機能します。
context.viewname.MergeOption = System.Data.Objects.MergeOption.NoTracking;
context.viewname.Where(x => x.columnname != null);