You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Linq中查询含计数、平均值的结果列表,解决仅返回单条数据问题

问题原因

你现有代码的核心错误有3个:

  • 第一步qr查询用了inner join关联评分表,直接过滤掉了没有用户评分的商品,自然返回的结果条数不全
  • 中间写的foreach循环没有任何实际作用,count和averaged是全局变量,循环结束后只会保存最后一个遍历到的商品的统计值,后续给所有商品赋值时都复用了这两个错误的全局值
  • 最后的关联查询依然用了inner join,进一步过滤掉了无评分的商品,最终结果自然不对

修正方案

直接用左关联+分组统计一步完成查询即可,不需要拆分多次查询和循环,修正后代码如下:

var query = from p in _context.Products
            where p.Status == true
            join r in _context.RatingProducts on p.ID equals r.IDProduct into ratingGroup
            from rg in ratingGroup.DefaultIfEmpty()
            group rg by p into g
            select new ProductQuery
            {
                ID = g.Key.ID,
                IDProduct = g.Key.IDProduct,
                CategoryID = g.Key.CategoryID,
                NumProduct = g.Key.NumProduct,
                Name = g.Key.Name,
                Status = g.Key.Status,
                Price = g.Key.Price,
                PriceOld = g.Key.PriceOld,
                ContentsSmall = g.Key.ContentsSmall,
                Contents = g.Key.Contents,
                Images = g.Key.Images,
                CountID = g.Count(x => x != null),
                AveragedID = g.Count(x => x != null) > 0 ? Math.Round(g.Average(x => x.StarRating), 1) : 0
            };
return query.OrderBy(x => x.NumProduct).ToList();

修正说明

  • 用into ratingGroup + DefaultIfEmpty()实现左关联,保留所有状态为启用的商品,哪怕没有对应评分记录
  • 直接按商品实体分组,一次统计出每个商品的评分数量和平均分,不需要额外二次关联和循环处理
  • 统计时过滤掉左关联产生的空评分记录,避免统计报错

内容的提问来源于stack exchange,提问作者Chim Di Tru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 05:27:03