我必须计算有子服务的服务总费用。 计算linq中实体总和的方法是:
double totalcost = db.Services.Sum(s=>s.cost);
但我如何计算列表服务的总费用,如:
double totalfee=db.services.childservices.sum(s=>s.fee);
或类似的东西? 我不想使用循环,因为我需要花费很长时间才能一次计算1000个服务!
答案 0 :(得分:2)
我认为你的模型类似于以下内容:
public class Service
{
public long Id { get; set; }
public double Cost { get; set; }
public ICollection<ChildService> ChildServices { get; set; }
}
public class ChildService
{
public long Id { get; set; }
public double Fee { get; set; }
}
然后你可以这样做来计算所有服务的总费用:
double? totalFee = db.Services.Sum(service => service.ChildServices.Sum(child => (double?)child.Fee));
如果在数据库中没有任何要求,那么double?
可以防范这种情况。在这种情况下,结果将是null
。
如果您想要所有服务的总费用清单,您可以:
List<double?> totalFees = db.Services.Select(service => service.ChildServices.Sum(child => (double?)child.Fee)).ToList();
如果您想要零而不是null
,只需将上述查询替换为:
double totalFee = db.Services.Sum(service => service.ChildServices.Sum(child => (double?)child.Fee)) ?? 0;
List<double> totalFees = db.Services.Select(service => service.ChildServices.Sum(child => (double?)child.Fee) ?? 0).ToList();
答案 1 :(得分:0)
var total = services.SelectMany(q => q.ChildServices).Distinct().Sum(p => p.Fee);
答案 2 :(得分:0)
var childFeeSum=from parentService in db.Services select new { Fee=parentService.Sum(parent=>parent.ChildServices.Sum(f=>f.Fee))};