.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条计数
验证与修复步骤
- 检查Nullable配置
查看项目的.csproj文件,确认是否开启了全局Nullable特性:
<Nullable>enable</Nullable>
同时检查实体类中是否有带?标记的可空属性。
- 临时验证方案
先将项目的全局Nullable特性改为禁用:
<Nullable>disable</Nullable>
或者移除实体类属性的?标记,重新运行分页代码,确认是否能正常返回数据。
- 持久化修复(保留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
相关产品推荐
相关产品推荐

