C#方法查询数据库返回int类型ProductionCostId的实现问题
现有代码的错误点
你的代码无法正常运行,是因为存在以下语法和逻辑问题:
- 外层
Where方法要求传入返回布尔值的筛选表达式,你传入的是内层查询生成的集合对象,不符合方法签名要求,编译都无法通过 - 整个查询最终返回的是
IEnumerable<int>类型的集合,和接口要求返回单个int值的定义不匹配 - 内外层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
相关产品推荐
相关产品推荐

