C# 如何使用实体框架中另一个表上的外键引用的聚合值更新表的所有行
我有一个用户表,我的用户实体有一个评级列。用户有一个名为IncomingRatings的导航属性,它是名为Rates的表中费率列表的一对多关系。评级可以是正的,也可以是负的,由IsPositive布尔值表示 我想找到该用户的所有评分,并将其存储在我的用户表的“评分”列中。考虑以下样本数据:C# 如何使用实体框架中另一个表上的外键引用的聚合值更新表的所有行,c#,linq,entity-framework,linq-to-entities,entityframework.extended,C#,Linq,Entity Framework,Linq To Entities,Entityframework.extended,我有一个用户表,我的用户实体有一个评级列。用户有一个名为IncomingRatings的导航属性,它是名为Rates的表中费率列表的一对多关系。评级可以是正的,也可以是负的,由IsPositive布尔值表示 我想找到该用户的所有评分,并将其存储在我的用户表的“评分”列中。考虑以下样本数据: RaterID | RatedID | IsPositive 1 2 1 4 1 0 5 2 1 2
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被ID2评级字段引用为3,因为她有3个正面评级
更新后,用户表应如下所示:
UserID | Rating
1 1
2 3
3 0
4 0
5 0
6 0
7 0
因为我需要这个语句来运行10000多条记录,所以我不能在我的ASP.NET网站中使用常规for循环来更新记录,因为当我调用SaveChanges时,它会逐个保存记录。我发现它可以在一次通话中更新许多记录。以下是我的两种方法:
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() });
但是,我得到的聚合可能不会出现在UPDATE语句的集合列表中。两个查询中都有错误。如何在Entity Framework 6.1中使用聚合值更新所有行?看起来像EntityFramework。Extended只能构建简单的更新语句,如
更新用户集评级=3,其中。。。
现在还没有
更新用户集评级=从中选择计数*。。。
太糟糕了
如果通过常规EF更新进行更新,但使用一次更改调用,则速度太慢,您可以考虑执行原始SQL来执行该作业。