C# LINQ实现工具表剩余未领用工具名称与数量查询
问题背景
现有三张关联表:
ToolsSummaryTable(工具领用记录表):存储工人领用工具的明细,通过ToolID外键关联工具表,WorkerID外键关联工人表,测试数据共4条:(1,2)、(2,3)、(3,2)、(1,2)Tools(工具库存表):存储工具基础信息,核心字段为工具名称Name、总库存数量Quantity,测试数据共4条:Screwdriver(库存2)、Hummer(库存3)、Wrench 17(库存1)、Pipe wrench(库存2)Workers(工人信息表):存储工人姓名信息,核心字段为FirstName、LastName
需求为查询所有尚有剩余库存的工具,返回工具名称、对应剩余可领用数量。
原代码问题
你写的LINQ存在两类错误:
- 语法层面:
Include方法后直接拼接where不符合EF Core的LINQ写法规范,缺少查询衔接、结果投影的必要结构 - 逻辑层面:
- 统计对象完全错误:
t.Tool.Name.Count()统计的是工具名称字符串的字符长度,根本没有统计该工具实际被领用的总次数 - 计算逻辑错误:剩余数量=总库存-累计领用数量,原代码没有做这个差值计算,也没有覆盖从未被领用(领用数为0)的工具场景
- 冗余关联:需求不需要关联工人表,不需要加载Worker相关数据
- 统计对象完全错误:
正确实现代码
使用左连接统计每个工具的累计领用次数,再计算剩余库存过滤即可,不需要关联工人表:
// 注意:如果你的Tools表主键字段名不是Id,替换成你实际的主键名即可 var remainingTools = context.Tools .GroupJoin( context.ToolsSummaryTable, tool => tool.Id, borrowRecord => borrowRecord.ToolId, (tool, borrowRecords) => new { ToolName = tool.Name, RemainCount = tool.Quantity - borrowRecords.Count() } ) .Where(item => item.RemainCount > 0) .ToList();
如果习惯用查询表达式写法,可以用下面的版本:
var remainingTools = from tool in context.Tools join record in context.ToolsSummaryTable on tool.Id equals record.ToolId into borrowHistory let borrowedCount = borrowHistory.Count() let remain = tool.Quantity - borrowedCount where remain > 0 select new { 工具名称 = tool.Name, 剩余数量 = remain }; var res = remainingTools.ToList();
测试数据运行结果验证
根据提供的测试数据计算:
- Screwdriver:总库存2,累计领用0,剩余2 → 命中返回
- Hummer:总库存3,累计领用3,剩余0 → 不返回
- Wrench 17:总库存1,累计领用1,剩余0 → 不返回
- Pipe wrench:总库存2,累计领用0,剩余2 → 命中返回
最终返回结果共2条:Screwdriver剩余2个,Pipe wrench剩余2个
内容的提问来源于stack exchange,提问作者RxNsx
相关产品推荐
相关产品推荐

