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

C#方法查询数据库返回int类型ProductionCostId的实现问题

现有代码的错误点

你的代码无法正常运行,是因为存在以下语法和逻辑问题:

  1. 外层Where方法要求传入返回布尔值的筛选表达式,你传入的是内层查询生成的集合对象,不符合方法签名要求,编译都无法通过
  2. 整个查询最终返回的是IEnumerable<int>类型的集合,和接口要求返回单个int值的定义不匹配
  3. 内外层Lambda表达式都用了x作为参数名,会产生变量作用域冲突,极易引发逻辑错误
正确实现方案

如果可以确定传入的参数一定能匹配到对应记录,不会出现空数据的情况,直接用以下实现即可:

public int Get(Guid productionLineId, string productionCode)
{
    return GetAll()
        .SelectMany(p => p.ProductionAssignments)
        .First(a => a.ProductionLine.Id == productionLineId && a.ProductionCode == productionCode)
        .ProductionCostId;
}

如果存在参数匹配不到数据的可能,需要加空值处理避免运行时报错,可以用以下写法,匹配不到时返回你自定义的默认值(示例里默认返回0):

public int Get(Guid productionLineId, string productionCode)
{
    var matchedAssignment = GetAll()
        .SelectMany(p => p.ProductionAssignments)
        .FirstOrDefault(a => a.ProductionLine.Id == productionLineId && a.ProductionCode == productionCode);
    return matchedAssignment?.ProductionCostId ?? 0;
}
实现说明
  • SelectMany的作用是把所有父实体下挂载的ProductionAssignments子集合,合并成一个平铺的ProductionAssignment实体序列,不需要嵌套两层Where做筛选
  • 用First/FirstOrDefault直接从平铺后的子实体序列中,找到符合生产线ID、生产编码条件的单条记录
  • 直接读取匹配记录的ProductionCostId属性返回,就是接口要求的int类型值

如果你调用的GetAll()方法本身返回的就是ProductionAssignment类型的集合,不需要查父实体,可以删掉SelectMany那行,直接在GetAll()后调用First/FirstOrDefault即可。

内容的提问来源于stack exchange,提问作者HassanJalali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:57:20