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

.NET 6与7中IQueryable分页查询结果不一致问题求助

.NET 7升级后EF Core 6分页查询Count正确但返回数据为空的问题解决

核心解决办法:对未通过IEntityTypeConfiguration手动配置映射的实体,禁用Nullable特性。

问题原因

你在升级到.NET 7后仍使用EF Core 6.0.12,两者在Nullable引用类型的处理逻辑上存在兼容性冲突。当实体启用了Nullable特性但未通过IEntityTypeConfiguration显式配置字段和导航属性的映射规则时,EF Core生成的查询语句会出现逻辑偏差:

  • 你的排序扩展方法结合Include(p => p.Template)后,.NET 7下EF生成的SQL会因为Nullable的隐式处理,导致排序后的数据集位置异常,最终Skip/Take无法取到数据
  • Count查询不涉及排序后的筛选逻辑,所以结果不受影响,依然返回正确的1条计数

验证与修复步骤

  1. 检查Nullable配置
    查看项目的.csproj文件,确认是否开启了全局Nullable特性:
<Nullable>enable</Nullable>

同时检查实体类中是否有带?标记的可空属性。

  1. 临时验证方案
    先将项目的全局Nullable特性改为禁用:
<Nullable>disable</Nullable>

或者移除实体类属性的?标记,重新运行分页代码,确认是否能正常返回数据。

  1. 持久化修复(保留Nullable特性)
    如果需要继续使用Nullable特性,为相关实体创建IEntityTypeConfiguration实现,显式配置所有字段的可空性和导航属性关联:
public class YourEntityConfiguration : IEntityTypeConfiguration<YourEntity>
{
    public void Configure(EntityTypeBuilder<YourEntity> builder)
    {
        // 配置排序字段的可空性
        builder.Property(e => e.YourSortField)
               .IsRequired(false);
        // 配置导航属性关联
        builder.HasOne(e => e.Template)
               .WithMany()
               .HasForeignKey(e => e.TemplateId);
    }
}

然后在DbContext中注册该配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyConfiguration(new YourEntityConfiguration());
}

补充说明

.NET 7优化了Nullable引用类型的元数据处理逻辑,但EF Core 6.x版本并未适配这些更新,导致在构建包含排序和导航属性的查询表达式时,生成的SQL逻辑出现错误,最终出现Count正确但返回数据为空的矛盾结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:55:27