2015-07-03 52 views
3

我必須計算有子級服務的服務的總費用。 計算在LINQ實體總和的方式是:計算列表父級的子實體的總和

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

但我怎麼能計算出的清單服務,如總費用:

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

或類似的東西? 我不想使用循環,因爲它需要很長時間,我一次需要計算1000個服務!

+0

你可以使用加入 –

+0

你能告訴我加入我的場景嗎?我使用DMBL和db是datacontext。 db.Services.Join(??? childservice) –

+0

Table descirption和接受的輸出指定 –

回答

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?在那裏守衛againt的在數據庫中沒有任何要求的情況下。在這種情況下,結果將是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(); 
+0

謝謝。但我需要計算一個服務列表,用於Ex 1000服務。 –

+0

以上查詢計算數據庫中所有服務的子服務費用總和,然後將所有這些總和作爲'totalFee'求和。這不是你想要的嗎? – ycsun

+0

我更新了我的答案以涵蓋更多案例。請看看這是你想要的。 – ycsun

0
var total = services.SelectMany(q => q.ChildServices).Distinct().Sum(p => p.Fee); 
0
var childFeeSum=from parentService in db.Services select new { Fee=parentService.Sum(parent=>parent.ChildServices.Sum(f=>f.Fee))};