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

T-SQL与EF Core LINQ相同查询条件返回结果数不一致问题

EF Core与原生T-SQL查询结果条数不一致排查方案

核心差异点定位

优先检查以下几类逻辑不一致问题,这是90%以上这类问题的成因:

  • 时间筛选逻辑不匹配
    原生T-SQL使用CAST(GETDATE() AS Date)做筛选条件,会将当前时间截断为当日0点,只要FechaOrientativa字段的日期部分大于等于当日,无论时分秒是多少都会被命中。
    原有EF Core代码使用DateTime.Now做比较,DateTime.Now携带当前运行时刻的时分秒值:例如下午15点执行接口时,该条件会自动过滤掉所有FechaOrientativa为当日0点到14:59之间的记录,这部分就是缺失记录的主要来源。
    额外注意:如果应用和Azure SQL数据库时区配置不一致,DateTime.Now(取应用服务器时区)和GETDATE()(取数据库时区)本身的时间值就存在偏差,也会放大筛选结果的差异。
  • EF Core全局查询过滤器干扰
    如果在DbContext中为Concursos实体配置了全局查询过滤器(常见的如软删除过滤IsDeleted = false、租户Id隔离、数据权限过滤等),所有EF Core默认查询都会自动追加对应的Where条件,而手写的原生T-SQL直接查表没有加这些过滤条件,也会导致返回条数少于预期。
  • 补充:原有代码的排序规则和T-SQL不一致(T-SQL按三个字段排序,EF Core仅按日期排序),该问题不会影响返回条数,但会导致返回结果顺序和校验结果不一致。

修复方案

  1. 对齐时间筛选逻辑,使用DateTime.Today(固定为当日0点)替代DateTime.Now,同时补全排序规则和T-SQL保持一致:
[HttpGet("sintratar")]
public async Task<ActionResult<IEnumerable<Concurso>>> GetConcursosSinTratar()
{
    var today = DateTime.Today;
    return await _context.Concursos
        .Where(c => c.Estudiar == "pt" && c.FechaOrientativa >= today)
        .OrderBy(c => c.FechaOrientativa)
        .ThenBy(c => c.Archivo)
        .ThenBy(c => c.Estado)
        .ToListAsync();
}
  1. 排查全局过滤器影响:临时在查询中追加.IgnoreQueryFilters()方法测试返回条数,如果加完后条数和T-SQL结果一致,说明是全局过滤器追加了额外过滤条件,需要结合业务判断该过滤逻辑是否符合预期,不要随意移除业务必须的过滤规则。
  2. 通用排查手段:开启EF Core的SQL日志输出,捕获EF Core实际执行的SQL语句,直接将生成的SQL放到Azure数据库中执行,和你手写的校验SQL逐段对比Where条件、表关联逻辑,即可快速定位所有不一致的点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:15:51