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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:21:28