1

ユーザー テーブルがあり、UserエンティティにRating列があります。にUserは というナビゲーション プロパティがあります。これは、 rates というテーブルの のIncomingRatingsリストの 1 対多の関係です。評価は正または負であり、ブール値Rateで表されます。IsPositive

そのユーザーのすべての評価を見つけてRating、テーブルの列に保存したいと思いUserます。次のサンプル データを検討してください。

RaterID | RatedID | IsPositive
1         2         1
4         1         0
5         2         1
2         3         0
3         2         1
7         2         0
6         1         1  

この場合、たとえば、ユーザー #2 (ID 2 で参照)Ratingのフィールドを 3 にします。彼女には 3 つの肯定的な評価があるからです。

更新後、users テーブルは次のようになります。

UserID | Rating
1        1
2        3
3        0
4        0
5        0
6        0
7        0

このステートメントを 10000 件以上のレコードに対して実行する必要があるため、ASP.NET Web サイトで通常の for ループを使用してレコードを更新することはできませんSaveChanges。1回の呼び出しで多くのレコードを更新できるEntityFramework.Extendedを見つけました。ここに私の2つのアプローチがあります:

db.Users.Where(u => true).Update(u => new User { Rating = u.IncomingRatings.Count(r => r.IsPositive) });
db.Users.Where(u => true).Update(u => new User { Rating = db.Rates.Where(r => r.RatedID == u.ID && r.IsPositive).Count() });

ただし、An aggregate may not appear in the set list of an UPDATE statement.両方のクエリでエラーが発生します。Entity Framework 6.1 で集計値を使用してすべての行を更新するにはどうすればよいですか?

4

1 に答える 1

1

EntityFramework.Extendedのような単純な UPDATE ステートメントを構築することしかできないように見えます

UPDATE User SET Rating = 3 WHERE ...

ではない(またはまだ)

UPDATE User SET Rating = (SELECT Count(*) FROM ... )

残念な...

通常の EF 更新によって更新を行うが、1 回のSaveChanges()呼び出しで更新を行うのが遅すぎる場合は、生の SQL を実行してジョブを実行することを検討できます。

于 2014-05-31T22:29:46.183 に答える