【发布时间】:2016-06-15 12:19:24
【问题描述】:
我有一张表,上面写着 Products,其中包含两列(ProductId、Price)。我正在从客户端(IOS、Android)获取产品 ID 列表。与其遍历列表并逐个获取价格然后计算平均值,还有什么更好的方法吗?
【问题讨论】:
标签: entity-framework linq aggregate-functions
我有一张表,上面写着 Products,其中包含两列(ProductId、Price)。我正在从客户端(IOS、Android)获取产品 ID 列表。与其遍历列表并逐个获取价格然后计算平均值,还有什么更好的方法吗?
【问题讨论】:
标签: entity-framework linq aggregate-functions
如果我理解正确,您有一个包含产品 ID 的列表,并希望获得所选产品的平均价格。您可以像这样使用Contains 和Average 的组合:
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;
【讨论】:
group by constant 才能产生多个聚合。
var average = ProductList.Select(p => p.Price).Average();
【讨论】: