C# 首先使用实体框架数据库预筛选结果
首先使用EF数据库,是否可以创建其中一个类的副本,以便任何查询都返回一个附加的过滤器 例如:给定一个类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
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();
}