向所有请求EF6添加条件

Rub*_*ury 4 entity-framework dynamicquery predicatebuilder entity-framework-6

我的大多数实体(并非全部)都有两个称为CompanyId和的属性Deleted。如何为所有选择请求自动插入这两个属性,而不是对整个应用程序中的每个查询手动进行设置。

例:

db.MyEntity.Where(me => me.Id == 1).Select(me => me.Description)
Run Code Online (Sandbox Code Playgroud)
  • 动态检查实体是否具有道具CompanyIdDeleted
  • 大小写肯定,像这样转换

db.MyEntity.Where(me => me.Id == 1 && Deleted == false && CompanyId == 1).Select(me => me.Description

  • 否定大小写,请保持相同的选择查询。

这将有助于我对所有具有可用属性的查询设置这些条件。

Sla*_*nov 5

您可以借助nuget包EntityFramework.Filters添加过滤器。同样,好主意是创建通用接口,而不是动态检查属性是否存在:

public interface IMyEntityInterface
{
    public int Id {get;set;}
    public bool Deleted {get;set;}
}

public class MyEntity : IMyEntityInterface
{
    public int Id {get;set;}
    public bool Deleted {get;set;}
    //other stuff
}

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{   
    modelBuilder.Conventions
       .Add(FilterConvention.Create<IMyEntityInterface, int, bool>("MyFilter", (entity, Id, Deleted) => entity.Id == Id && entity.Deleted == Deleted);
}
Run Code Online (Sandbox Code Playgroud)

用法:

var filter = db.EnableFilter("MyFilter");
filter.SetParameter("Id", 1);
filter.SetParameter("Deleted", false);

var data = db.MyEntity.Where(me => me.CompanyId == 1).Select(me => me.Description);
//select Description from MyEntities where Id = 1 and Deleted = false and CompanyId = 1
Run Code Online (Sandbox Code Playgroud)