1

我有一个用户表,我的User实体有一个Rating列。AUser有一个名为 的导航属性,它是一个名为 rate 的表中 sIncomingRatings列表的一对多关系。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 个正面评价。

更新后,用户表应该是这样的:

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

4

1 回答 1

1

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

UPDATE User SET Rating = 3 WHERE ...

而不是(或还没有)

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

太糟糕了...

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

于 2014-05-31T22:29:46.183 回答