【问题标题】:Linq group by, orderbydescending, and countLinq group by、orderbydescending 和 count
【发布时间】:2014-05-20 13:04:22
【问题描述】:

所以我正在尝试使用 linq 语句对两个数据库表进行分组,并根据每个类别的评论数选择前 25 个。所以我的sql语句是

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

效果很好。所以现在尝试在我的 web 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 时,所有计数都相同......所以我做错了什么。

【问题讨论】:

    标签: c# asp.net sql linq asp.net-web-api


    【解决方案1】:

    试试这个可能对你有用

    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);
    

    【讨论】:

      【解决方案2】:

      用这个解决问题

      [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();
          }
      

      【讨论】:

        猜你喜欢
        • 2018-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多