【问题标题】:How to get average based on list of Ids in entity framework如何根据实体框架中的 ID 列表获取平均值
【发布时间】:2016-06-15 12:19:24
【问题描述】:

我有一张表,上面写着 Products,其中包含两列(ProductId、Price)。我正在从客户端(IOS、Android)获取产品 ID 列表。与其遍历列表并逐个获取价格然后计算平均值,还有什么更好的方法吗?

【问题讨论】:

    标签: entity-framework linq aggregate-functions


    【解决方案1】:

    如果我理解正确,您有一个包含产品 ID 的列表,并希望获得所选产品的平均价格。您可以像这样使用ContainsAverage 的组合:

    List<int> productIds = ...;
    var averagePrice = db.Products
        .Where(p => productIds.Contains(p.ProductId))
        .Select(p => p.Price)
        .DefaultIfEmpty()
        .Average();
    

    需要Select后跟DefaultIfEmpty以避免过滤集不包含记录时出现异常。

    更新:根据评论,使用group by 常量构造也可以通过单个查询获取多个聚合:

    var info = (from p in db.Products
                where productIds.Contains(p.ProductId)
                group p by 0 into g // any constant would work
                select new
                {
                   MinPrice = g.Min(p => p.Price),
                   MaxPrice = g.Max(p => p.Price),
                   AveragePrice = g.Average(p => p.Price),
                }).FirstOrDefault();
    var minPrice = info != null ? info.MinPrice : 0;
    var maxPrice = info != null ? info.MaxPrice : 0;
    var averagePrice = info != null ? info.AveragePrice : 0;
    

    【讨论】:

    • 谢谢 Ivan,只是想知道,是否可以在单个查询中获取最小值、最大值和平均值?
    • 我认为这是可能的,尽管在 LINQ 中不是很自然。我记得,需要使用group by constant 才能产生多个聚合。
    • 再次感谢伊万 :)
    【解决方案2】:
    var average = ProductList.Select(p => p.Price).Average();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 2020-12-21
      • 2017-10-12
      • 1970-01-01
      • 2011-08-03
      • 2011-06-01
      相关资源
      最近更新 更多