繁体   English   中英

如何使用Entity Framework中另一个表上的外键引用的汇总值更新表的所有行

[英]How to update all rows of a table with an aggregate value referenced by foreign key on an another table in Entity Framework

我有一个用户表,我的User实体有一个Rating列。 User具有一个称为IncomingRatings的导航属性,该属性是来自名为rate的表中Rate列表的一对多关系。 评分可以是正数或负数,并由IsPositive布尔值表示。

我想找到该用户的所有评分,并将其存储在“ User表的“ Rating列中。 考虑以下样本数据:

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。

更新之后,用户表应如下所示:

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

因为我需要该语句来运行10000条以上的记录,所以我无法在ASP.NET网站中使用常规的for循环来更新记录,因为当我调用SaveChanges时,它将逐一保存它们。 我发现EntityFramework.Extended可以在一个调用中更新许多记录。 这是我的两种方法:

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中使用汇总值更新所有行?

看起来像EntityFramework.Extended仅能构建简单的UPDATE语句,例如

UPDATE User SET Rating = 3 WHERE ...

而不是(或尚未)

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

太糟糕了...

如果通过常规的EF更新进行更新,但是只调用一次SaveChanges() ,则速度太慢,您可以考虑执行原始SQL来完成这项工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM