实体框架核心过滤器DbSet

8
在Entity Framework Core中,是否可以自动过滤DbContextDbSet<TEntity>? 我想要实现类似这样的功能,但是针对的是EntityFrameworkCore。 在访问DbSet<TEntity>之前,我希望自动过滤IQueryable<TEntity>

请查看此链接 全局查询过滤器 - Sina Lotfi
3个回答

8

您可以查看下面的链接。

https://learn.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 );
    }
}

他正在请求通用的DbSet<T>。 - Ali.Rashidi

4

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

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

维基:EF+查询过滤器

// 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();

3
一种选项是实现一个外观类来进行过滤:
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,您可能需要这样做。


1
有没有一种方法可以直接在DbContext的实体中完成这个操作? - Thomas Gassmann
或许是个奇怪的问题,但为什么要使用 EtityTypes => _context... 这种方式呢?为什么不将其作为属性,例如 public IQueryable<EntityType> EntityTypes { get { return _DataContext.EntityTypes.Where(et => et.SomeId.Equals(_someValue)); } } 呢? - rasmus91
如果我理解你的问题正确,那么这正是我在这里所做的事情 :) 语法public Type Name => _something;public Type Name { get { return _something; }}完全相同。只是更短而已。 - juunas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接