实体框架核心过滤器DbSet

时间:2017-03-07 13:06:46

标签: c# .net entity-framework asp.net-core

Entity Framework Core是否可以自动过滤DbSet<TEntity>的{​​{1}}? 我希望仅针对EntityFrameworkCore实现something like that。 我希望在通过DbContext访问IQueryable<TEntity>之前自动过滤DbSet<TEntity>

3 个答案:

答案 0 :(得分:3)

免责声明:我是该项目的所有者Entity Framework Plus

EF +查询过滤器允许您过滤DbSet并支持.NET Core(请务必阅读限制部分)

维基:EF+ Query Filter

// using Z.EntityFramework.Plus; // Don't forget to include this.
var ctx = new EntitiesContext();

ctx.Filter<Post>(q => q.Where(x => !x.IsSoftDeleted));

// SELECT * FROM Post WHERE IsSoftDeleted = false
var list = ctx.Posts.ToList();

答案 1 :(得分:2)

一种选择是实现进行过滤的外观类:

public class DataService
{
    private readonly DataContext _context;

    public DataService(DataContext context)
    {
        _context = context;
    }

    public IQueryable<EntityType> EntityTypes => _context.EntityTypes.Where(t => t.Something == true);
}

DataContext是您的EF DbContext,EntityType是您实体的类型。

然后其他类可以使用这个。注意我没有在这里实现IDisposable,你可能想要这样做。

答案 2 :(得分:2)

您可以查看以下链接。

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0#model-level-query-filters

实施例

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    public int TenantId { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>().HasQueryFilter(
            p => !p.IsDeleted
            && p.TenantId == this.TenantId );
    }
}