Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 首先使用实体框架数据库预筛选结果_C#_Asp.net_Entity Framework - Fatal编程技术网

C# 首先使用实体框架数据库预筛选结果

C# 首先使用实体框架数据库预筛选结果,c#,asp.net,entity-framework,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

首先使用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; }
  }
公共部分类人员
{
公众人士()
{
this.Job=new HashSet();
}
公共int PersonID{get;set;}
public int JobID{get;set;}
公共字符串名{get;set;}
公共字符串姓氏{get;set;}
公共虚拟ICollection约会{get;set;}
}
是否可以以某种方式构造类的副本,使其功能类似于现有类,但只返回应用于“where Forename='David'”的结果

我无法覆盖现有类(两种情况都需要保留,无论如何都会被覆盖)


我的第一个想法是简单地创建一个单独的静态类,其中包含返回IQueryable的方法,但稍后调用该类时,上下文已被释放-我不认为您可以将其附加到新上下文?

最好是在
部分类中向
DbContext
添加一个函数t返回一个已应用过滤器的
IQueryable

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



您可能还可以用
IDBCommandInterceptor
装配一些东西,但这将是巨大的、黑客式的、丑陋的,并且超出了这样一个简单答案的范围。

您可以做的最好的方法是在
分部类中向
DbContext
添加一个函数,该函数返回带有过滤器的
IQueryable
呃已经申请了

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



你也可以用
IDBCommandInterceptor
来装配一些东西,但那将是巨大的、骇人的、丑陋的,并且超出了这样一个简单答案的范围。

这个类是单人还是多人?类名是复数的,但它有PersonId和person的名字和姓氏。可能不适用于你,但是EF Core 2。0引入了一个支持此用例的类。好吧,它不是一个真正的类-只是我编造的一个示例,所以我很抱歉。但是它的目的是一个人(约会时一对多)@GeorgPatscheider-谢谢,我现在不在core上,但很高兴知道以后的情况!如果类是一个人,那么如果实例与过滤器不匹配,那么应用过滤器的实例会是什么样子?当第一个名称不同时,IOW-
PersonWithFirstNameFilterApplied
-是什么,null?这个类是什么一个人还是多个人?类名是复数的,但它有一个PersonId和person的名字和姓氏。可能不适用于您,但引入了EF Core 2.0,它将支持此用例。好吧,它不是一个真正的类-只是我编的一个示例,所以我很抱歉。但目的是一个人(一对多预约)@GeorgPatscheider-谢谢,我现在不在core上,但这对将来的了解很好!如果类是一个人,那么如果实例与过滤器不匹配,那么应用过滤器的实例会是什么样子?当第一个名称不同时,IOW-
PersonWithFirstNameFilterApplied
-它是什么,null?很好,b但是,如果/当重新生成上下文时,它不会潜在地丢失吗?您可以将它放在一个单独的文件中,并使其成为一个
部分类
,这样它将从生成的代码中与类合并,并且在更新上下文时不会被覆盖。您可以使用相同的概念安全地扩展大量生成的代码。这很好,但如果/当重新生成上下文时,它不会丢失吗?您可以将它放在一个单独的文件中,并使其成为一个
部分类
,这样它将从生成的代码中与类合并,并且在更新上下文时不会被覆盖。您可以使用相同的概念安全地扩展大量生成的代码。
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();
}