增加IsDeleted属性

软删除,设置IsDelete为true

        Student s = ctx.Students.FirstOrDefault(s => s.Id == 10);

        s.IsDeleted = true;
        await ctx.SaveChangesAsync();

调用HasQueryFilter

        public void Configure(EntityTypeBuilder<Student> builder)
        {
            builder.ToTable("student");

            builder.Property(e => e.Name).HasColumnType("nvarchar(50)").IsRequired();
            builder.HasQueryFilter(s => !s.IsDeleted);
        }

普通查询

        foreach (Student s in ctx.Students.Where(s => s.Id >= 9 && s.Id <= 12))
        {
            Console.WriteLine(s.Name);
        }

可以看到查询语句多了IsDeleted <> 1,返回结果也没有包括id=10的记录

使用IgnoreQueryFilters(),忽略过滤器

        foreach (Student s in ctx.Students.IgnoreQueryFilters().Where(s => s.Id >= 9 && s.Id <= 12))
        {
            Console.WriteLine(s.Name);
        }

要注意,查询筛选可能带来性能问题。

由于增加了where子句,可能会使得已有的索引失效,最终导致全表扫描,影响性能。