ASP.NET查询Objetivoes表两列匹配条件时获取对应行ID的问题
代码错误点
原代码无法达到预期效果是因为存在以下明确问题:
- 条件逻辑错误:需求是同时匹配月份、年份两个条件,代码里用了
||或逻辑运算符,会返回任意匹配单条件的记录,不符合要求,需要替换为&&与逻辑运算符。 - 上下文作用域错误:查询
datacorrespondeId的代码写在了Volta12BaseDEntities实例初始化的外面,此时bd对象还未创建,直接调用会抛出对象未实例化错误,所有数据库操作都要放在using包裹的上下文生命周期内。 - 返回字段错误:
FirstOrDefault()默认返回整条实体对象,不是目标字段datacorrespondeID,需要加Select指定取对应ID字段。 - 取值逻辑错误:
Where()方法返回的是查询结果集合,直接调用ToString()只会得到集合的类型名称,拿不到ValorObjetivo的实际值;且匹配条件写反,应该用查到的datacorrespondeID匹配表主键字段,而非匹配ValorObjetivo字段。 - 冗余转换:当前年月直接取
DateTime.Now的Month、Year属性就是int类型,不需要先转字符串再反序列化回int,多余操作会增加不必要的开销和异常风险。
修正后代码
using (Volta12BaseDEntities bd = new Volta12BaseDEntities()) { int currentMonth = DateTime.Now.Month; int currentYear = DateTime.Now.Year; // 查询同时满足年月匹配条件的记录,取对应datacorrespondeID var datacorrespondeId = bd.Objetivoes .Where(m => m.MesObjetivo == currentMonth && m.AnoObjetivo == currentYear) .Select(m => m.datacorrespondeID) .FirstOrDefault(); if (datacorrespondeId != null) { // 根据ID查询对应的ValorObjetivo值 int objetivoValue = bd.Objetivoes .Where(m => m.datacorrespondeID == datacorrespondeId) .Select(m => m.ValorObjetivo) .FirstOrDefault(); var objetivoList = new List<Objetivo>() { new Objetivo{ ValorObjetivo = objetivoValue, MesObjetivo = currentMonth, AnoObjetivo = currentYear } }; // 后续写入objetivoList相关的业务逻辑即可 } else { // 这里写未匹配到对应年月记录时的分支逻辑 } }
注意:如果你的
datacorrespondeID是值类型(比如int、Guid),判断非空的时候可以根据实际类型调整判断逻辑,比如int类型判断datacorrespondeId != 0即可。
内容的提问来源于stack exchange,提问作者Tomás Simões
相关产品推荐
相关产品推荐

