LINQ to Entities无法识别该方法

时间:2014-12-23 14:06:05

标签: c# .net linq entity-framework linq-to-entities

这是我提取数据的代码。

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
但是怎么样? 谢谢

2 个答案:

答案 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()

顺便说一句,为什么是扩展方法。