2014-12-23 1 views
2

이것은 데이터를 가져 오는 내 코드입니다.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 

그러나 방법을 사용할 필요가 알게? 감사합니다

+0

개체를 만들기 위해 복잡한 계산을하기 전에 데이터베이스에서 항목을로드하려면'ToList()'를 호출하면됩니다. – Jonesopolis

+0

@Jonesy 고마워요. – ujjaval

+0

무관계 .. 솔직히 말해서이 코드를 루프로 리팩터링해야한다고 생각합니다. –

답변

5

당신은 엔티티 쿼리에 LINQ 내부 조건문을 사용할 수 있습니다

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 

이이 서버에 의해 계산되며, 목록의 일부로 반환됩니다. 비록 당신이 말했듯이 1 천만 행이 있지만, 이것을 실행하기 전에 심각한 필터링을 할 것입니다.

+0

고마워. 내가 원하는거야. :) – ujjaval

1

LINQ (엔티티) 쿼리 내의 코드가 데이터베이스 내에서 실행되므로 임의의 C# 코드를 입력 할 수 없습니다. 따라서 검색 후 user.GetPullerRating()을 사용하거나 매번 계산하지 않으려는 경우 속성을 만들어야합니다.

당신도 할 수 있습니다 :

foreach (var u in list) 
    u.Rating = u.GetPullerRating() 

그런데, 왜 확장 방법이다.

+0

컴파일러는 확장 메서드를 형식에 바인딩 할 수 있는지 여부를 어떻게 확인합니까? 엔티티 클래스에 플래그/속성이 있습니까? –

+0

@LewsTherin 현재로서는 사용자 지정 확장 메서드를 만들 수있는 메커니즘이 없다는 것을 알고 있습니다. Linq 구현에서 (EF로) 하드 코드되어 있기 때문입니다. http://msdn.microsoft.com/en-us/library/bb738681.aspx – Andrey

+0

@Andrey 1 천만 개의 레코드가 있기 때문에 죄송합니다. Foreach 루프를 사용할 수 없습니다. – ujjaval

관련 문제