【问题标题】:Entity Framework Core Filter DbSet实体框架核心过滤器 DbSet
【发布时间】:2017-03-07 13:06:46
【问题描述】:

是否可以在 Entity Framework Core 中自动过滤 DbSet<TEntity>DbContext? 我正在为 EntityFrameworkCore 实现something like that。 我想在通过DbSet<TEntity> 访问之前自动过滤IQueryable<TEntity>

【问题讨论】:

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


【解决方案1】:

你可以看看下面的链接。

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 );
    }
}

【讨论】:

    【解决方案2】:

    免责声明:我是项目的所有者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();
    

    【讨论】:

      【解决方案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,你可能想要这样做。

      【讨论】:

      • 有没有办法直接在 DbContext 的实体中执行此操作?
      • 也许是个奇怪的问题,但我的意思是为什么EtityTypes =&gt; _context...,为什么不让它成为属性,比如public IQueryable&lt;EntityType&gt; EntityTypes { get { return _DataContext.EntityTypes.Where(et =&gt; et.SomeId.Equals(_someValue)); } }
      • 如果我正确理解了您的问题,那与我在这里所做的完全一样 :) 语法 public Type Name =&gt; _something;public Type Name { get { return _something; }} 完全相同。它只是更短。