ユーザー テーブルがあり、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 で集計値を使用してすべての行を更新するにはどうすればよいですか?