C# 实体框架核心过滤器数据库集

C# 实体框架核心过滤器数据库集,c#,.net,entity-framework,asp.net-core,C#,.net,Entity Framework,Asp.net Core,在实体框架核心中是否可以自动过滤DbContext的DbSet? 我希望只为EntityFrameworkCore实现。 我想在通过DbSet访问IQueryable之前自动过滤IQueryable,一个选项是实现一个进行过滤的facade类: public class DataService { private readonly DataContext _context; public DataService(DataContext context) {

在实体框架核心中是否可以自动过滤
DbContext
DbSet
? 我希望只为EntityFrameworkCore实现。
我想在通过
DbSet
访问
IQueryable
之前自动过滤
IQueryable
,一个选项是实现一个进行过滤的facade类:

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上下文)
{
_上下文=上下文;
}
public IQueryable EntityTypes=>\u context.EntityTypes.Where(t=>t.Something==true);
}
其中,
DataContext
是EF DbContext,而
EntityType
是实体的类型


那么其他类就可以使用这个类了。注意:我没有在这里实现IDisposable,您可能想这样做。

免责声明:我是项目的所有者

EF+查询筛选器允许您筛选DbSet和support.NET Core(请确保阅读限制部分)

维基:

//使用Z.EntityFramework.Plus;//别忘了包括这个。
var ctx=new EntitiesContext();
过滤(q=>q.Where(x=>!x.issoftdelected));
//从Post中选择*其中IsSoftDeleted=false
var list=ctx.Posts.ToList();

您可以查看下面的链接

范例

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 );
    }
}
公共类BloggingContext:DbContext
{
公共数据库集博客{get;set;}
公共DbSet Posts{get;set;}
public int TenantId{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity().HasQueryFilter(
p=>!p.IsDeleted
&&p.TenantId==this.TenantId);
}
}

是否有一种方法可以直接在DbContext的实体中实现这一点?也许是个奇怪的问题,但为什么
EtityTypes=>\u context…
我的意思是,为什么不将其设为属性,比如
public-IQueryable-entitypes{get{return u-DataContext.entitypes.Where(et=>et.SomeId.Equals)(_someValue));}}
?如果我正确理解了你的问题,这与我在这里所做的完全相同:)语法
公共类型名称=>\u something
公共类型名称{get{return\u something;}}
完全相同。只是短一点。请看这个链接
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 );
    }
}