优化C# Lambda LINQ查询:获取关联表服务计数与金额字段
问题背景
你有两张关联表billing_transactions和billing_transaction_accessorial_charge(一对多关系),需要查询每笔交易是否包含service_code_id=1(住宅配送)和service_code_id=2(洗碗机配送)这两种服务类型的零种、一种或两种,同时还要获取对应服务的费用金额。之前的查询只能返回对应服务的记录集合,无法直接拿到金额总和。
解决思路
其实你已经走对了方向,问题的核心在于:之前用Where返回的是符合条件的子表记录集合,要获取金额的话,只需要对这个集合的amount字段做求和操作即可。如果需要统计对应服务的数量,用Count()方法会比直接返回集合更直观(当然你也可以保留集合用于后续特殊处理)。
最终实现代码
你已经给出了正确的最终代码,这里整理成清晰的代码块:
var gridData = (from d in db.billing_transactions where (d.Id > 954 && d.Id < 958) select new { d.base_amount, d.Id, dish_charge = d.billing_transaction_accessorial_charge.Where(p => p.service_code_id == 2).Sum(l => l.amount), dish_count = d.billing_transaction_accessorial_charge.Count(p => p.service_code_id == 2), res_count = d.billing_transaction_accessorial_charge.Count(p => p.service_code_id == 1), res_charge = d.billing_transaction_accessorial_charge.Where(p => p.service_code_id == 1).Sum(l => l.amount), }).ToArray();
(注:这里把你原来的dish_count和res_count改成了Count()方法,直接返回服务数量会更实用;如果确实需要保留完整记录集合,也可以改回原来的Where写法)
补充说明
Sum(l => l.amount)会自动处理没有对应服务的情况,此时返回0,正好对应“零种”服务的场景- 通过
dish_count和res_count的数值(0、1或更多),就能快速判断该交易包含的服务类型:- 两个都为0:零种服务
- 其中一个大于0:一种服务
- 两个都大于0:两种服务
内容的提问来源于stack exchange,提问作者Joe Ruder
相关产品推荐
相关产品推荐

