这是我提取数据的代码。
var list = (from u in _dbContext.Users
where u.IsActive
&& u.IsVisible
&& u.IsPuller.HasValue
&& u.IsPuller.Value
select new PartsPullerUsers
{
AvatarCroppedAbsolutePath = u.AvatarCroppedAbsolutePath,
Bio = u.Bio,
CreateDateTime = u.CreationDate,
Id = u.Id,
ModifieDateTime = u.LastModificationDate,
ReviewCount = u.ReviewsReceived.Count(review => review.IsActive && review.IsVisible),
UserName = u.UserName,
Locations = (from ul in _dbContext.UserLocationRelationships
join l in _dbContext.Locations on ul.LocationId equals l.Id
where ul.IsActive && ul.UserId == u.Id
select new PartsPullerLocation
{
LocationId = ul.LocationId,
Name = ul.Location.Name
}),
Rating = u.GetPullerRating()
});
现在这是我的扩展。
public static int GetPullerRating(this User source)
{
var reviewCount = source.ReviewsReceived.Count(r => r.IsActive && r.IsVisible);
if (reviewCount == 0)
return 0;
var totalSum = source.ReviewsReceived.Where(r => r.IsActive && r.IsVisible).Sum(r => r.Rating);
var averageRating = totalSum / reviewCount;
return averageRating;
}
我已查看此帖子LINQ to Entities does not recognize the method
我知道我需要使用
public System.Linq.Expressions.Expression<Func<Row52.Data.Entities.User, int>> GetPullerRatingtest
但是怎么样?
谢谢
答案 0 :(得分:5)
您可以在LINQ to Entity查询中使用条件:
AverageRating = u.ReviewsReceived.Count(r => r.IsActive && r.IsVisible) > 0 ?
u.ReviewsReceived.Where(r => r.IsActive && r.IsVisible).Sum(r => r.Rating) /
u.ReviewsReceived.Count(r => r.IsActive && r.IsVisible)
: 0
这将由服务器计算,并作为列表的一部分返回。虽然像你说的那样有1000万行,但在执行之前我会做一些严肃的过滤。
答案 1 :(得分:1)
LINQ(to Entities)查询中的代码在数据库中执行,因此您无法在其中放置随机C#代码。因此,您应该在检索后使用user.GetPullerRating()
,或者如果您不想每次都进行计算,请创建一个属性。
你也可以这样做:
foreach (var u in list)
u.Rating = u.GetPullerRating()
顺便说一句,为什么是扩展方法。