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

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存在两类错误:

  1. 语法层面:Include方法后直接拼接where不符合EF Core的LINQ写法规范,缺少查询衔接、结果投影的必要结构
  2. 逻辑层面:
    • 统计对象完全错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:54:18