使用实体框架数据库预先过滤结果

时间:2018-01-08 13:50:48

标签: c# asp.net entity-framework

首先使用EF数据库,是否可以创建其中一个类的副本,以便使用额外的过滤器返回任何查询?

作为一个例子:给定一个类

 public partial class Person
 {
 public Person()
    {
        this.Job= new HashSet<Appointments>();
    }

    public int PersonID { get; set; }
    public int JobID { get; set; }
    public string Forename { get; set; }
    public string Surname { get; set; }

  public virtual ICollection<Appointments> Appointments { get; set; }
  }

是否可以以某种方式构建类的副本,其功能类似于现有类,但仅返回应用的结果&#34;其中Forename =&#39; David&#39;)

我无法覆盖现有的课程(这两种情况都需要保留,并且无论如何都会被覆盖)

我的第一个想法是简单地创建一个单独的静态类,其方法返回IQueryable&lt;人员&gt;,但稍后再说,上下文已被处理 - 我不认为你可以将它附加到新的上下文?

1 个答案:

答案 0 :(得分:2)

您可以做的最好的事情是向DbContext中的partial class添加一项功能,该功能会返回已应用过滤器的IQueryable<Persons>

部分类应与实际上下文类具有相同的名称。部分类中的任何代码都将与Database-First生成的类合并,就好像它们位于同一文件中一样。如果重新生成上下文,它也不会被代码生成器触及或覆盖。您可以使用相同的概念来扩展所有类型的代码生成的类(这正是为partial类设计的用例类型。)

public partial class MyDbContext
{
    public IQueryable<Persons> FilteredPersons()
    {
        return this.Persons.Where(p => p.Forename =="David");
    }
}

然后你可以这样称呼它:

using (var myContext = new MyDbContext())
{
    var query = myContext.FilteredPersons().Where(...some additional filter...);
    var results = query.ToList();
}

你可能还可能使用IDBCommandInterceptor进行操作,但这会很大,很丑陋,很丑陋,并且超出了这样一个简单答案的范围。