2014-04-08 2 views
0

그래서 두 개의 db 테이블을 그룹화하고 각 카테고리의 리뷰 수를 기준으로 상위 25 개를 선택하기 위해 linq 문을 수행하려고합니다. 그래서 내 SQL 문은Linq group by, orderbydescending, and count

SELECT TOP 25 BusinessCategories.Category, COUNT(*) as count 
FROM Reviews 
JOIN BusinessCategories 
ON BusinessCategories.BusinessID=Reviews.BusinessID 
GROUP BY BusinessCategories.Category 
ORDER BY count desc 

입니다. 완벽하게 작동합니다. 이제는 내 웹 API에서이 작업을 수행하려고하는데 문제가 있습니다. ...

var top = (from review in Db.Reviews 
      from category in Db.BusinessCategories 
      where review.BusinessID == category.BusinessID 
      group review by category into reviewgroups 
      select new TopBusinessCategory 
      { 
       BusinessCategory = reviewgroups.Key, 
       Count = reviewgroups.Count() 
      } 
      ).OrderByDescending(x => x.Count).Distinct().Take(25); 

이 나에게주는 동일한 결과의 일부,하지만 브라우저에서 API를 호출 할 때 모든 카운트가 동일한 것 같습니다 그래서 내가 뭔가 잘못하고 있어요 : 이것은 내가 무엇을 가지고 .

답변

0

[HttpGet] 
    [Queryable()] 
    public IQueryable<TopBusinessCategory> GetTopBusinessCategories() 
    { 
     var top = (from p in Db.BusinessCategories 
        join c in Db.Reviews on p.BusinessID equals c.BusinessID into j1 
        from j2 in j1.DefaultIfEmpty() 
        group j2 by p.Category into grouped 
        select new TopBusinessCategory 
        { 
         BusinessCategory = grouped.Key, 
         Count = grouped.Count(t => t.BusinessID != null) 
        }).OrderByDescending(x => x.Count).Take(25); 

     return top.AsQueryable(); 
    } 
를 사용하여 문제 해결을 위해 작동 할 수있다 시도
0

이 당신

var top = (from review in Db.Reviews 
      join category in Db.BusinessCategories 
      on review.BusinessID equals category.BusinessID 
      group review by category into reviewgroups 
      select new TopBusinessCategory 
      { 
       BusinessCategory = reviewgroups.Key, 
       Count = reviewgroups.Key.categoryId.Count() //CategoryId should be any 
                  //property of Category or you   
                  //can use any property of category 
      }).OrderByDescending(x => x.Count).Distinct().Take(25);