web-dev-qa-db-ja.com

エンティティフレームワーク。返された重複レコードを表示する

ビューを含む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に実行すると、異なるレコードが返されます。

43

@ Giovaneによる回答

ビューを処理するEntity Frameworkのシステムでも同じ問題が発生しました。 ROW_NUMBER()OVER()SQLを使用して一意の値を持つ列を作成してみてくださいが、機能しませんでした

私は同じことをしましたが、それを機能させるには、EDMXモデルを開いて、この列をエンティティキーとして選択する必要があります

enter image description here

その後、動作します

これに関する非常に良い記事があります

重複レコード

最も重要な記事は次のとおりです。

エンティティモデルにビューを含める場合、モデルは最初のnull不可の列を主キーとして使用するようです(主キーで使用されるすべての列はnull可能ではない)。

83
Moons

あなたがする必要があるのは:context.viewname.AsNoTracking().Where(x => x.ColumnName != null);

51
Rahul Garg

Entity Frameworkがビューを処理するシステムでも同じ問題が発生しました。 ROW_NUMBER()OVER()SQLを使用して一意の値を持つ列を作成してみてくださいが、機能しませんでした。

さらにフィールド、ビューの別のテーブルのFKを挿入する必要があります。これにより、エンティティEntityKeyMembers Elimiteの追加トレーニングとして追加できるようになり、繰り返しの問題が発生します。

したがって、このような状況でも問題が解決しない場合の解決策は、テーブルのEntityKeyを形成するフィールドのMEMBERSになるようにFK列を挿入することです。

12
Giovane

ビューで、次のように最初のレコードを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);
1
Rikin Patel