计算列表父元素的子实体的总和

时间:2015-07-03 06:31:24

标签: c# linq

我必须计算有子服务的服务总费用。 计算linq中实体总和的方法是:

double totalcost = db.Services.Sum(s=>s.cost);

但我如何计算列表服务的总费用,如:

double totalfee=db.services.childservices.sum(s=>s.fee);

或类似的东西? 我不想使用循环,因为我需要花费很长时间才能一次计算1000个服务!

3 个答案:

答案 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))};