如何根据实体框架中的ID列表获得平均值

时间:2016-06-15 12:19:25

标签: entity-framework linq aggregate-functions

我有一个表格,其中包含产品,其中包含两列( ProductId,Price )。我从客户端(IOS,Android)获得产品ID列表。而不是迭代列表并逐个获得价格然后计算平均值,有没有更好的方法呢?

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您有一个包含产品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;

答案 1 :(得分:1)

var average = ProductList.Select(p => p.Price).Average();