You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:33:47