C# TPH继承中子类型的LINQ.Include()属性
我正在实体框架中使用每层次表(TPH)继承。现在我想得到一个部门列表,在这个例子中,部门可以是一个子类型。我希望集合中的项目包括它们自己的自定义属性,而不仅仅是基本模型的属性 我怎样才能做到这一点C# TPH继承中子类型的LINQ.Include()属性,c#,json,linq,inheritance,C#,Json,Linq,Inheritance,我正在实体框架中使用每层次表(TPH)继承。现在我想得到一个部门列表,在这个例子中,部门可以是一个子类型。我希望集合中的项目包括它们自己的自定义属性,而不仅仅是基本模型的属性 我怎样才能做到这一点 public class Department { public Department() { DepartmentType = this.GetType.Name; } public int Id {get; set;} public stri
public class Department
{
public Department()
{
DepartmentType = this.GetType.Name;
}
public int Id {get; set;}
public string DepartmentType {get; set;}
}
public class Finance : Department
{
public virtual Manager Manager {get; set;}
}
public class Sports : Department
{
public virtual Coach Coach {get; set;}
}
// This obviously crashes instantly
// How can I include Manager if type is Finance and Coach if type is Sports?
context.Departments
.Include(c => (c is Finance) ? c.Manager : null)
.Include(c => (c is Sports) ? c.Coach : null);
我甚至尝试返回IEnumerable
,并为每个子类型添加一个多态方法,如下所示:
public class Sports : Department
{
public Coach Coach {get; set;}
public object Export()
{
return new
{
this.Id,
this.DepartmentType,
this.Coach
}
}
}
context.Departments.Select(c => c.Export())
然后像这样做:
public class Sports : Department
{
public Coach Coach {get; set;}
public object Export()
{
return new
{
this.Id,
this.DepartmentType,
this.Coach
}
}
}
context.Departments.Select(c => c.Export())
但这也不行
所需的JSON用法
通过这种方式,您可以找到财务和体育部门,并包括其财产:
var financeDeparments = context.Departments.OfType<Finance>().Include(p => p.Manager).ToList();
var sportDepartments = context.Departments.OfType<Sports>().Include(p => p.Coach).ToList();
var financedepartments=context.Departments.OfType().Include(p=>p.Manager.ToList();
var sportDepartments=context.Departments.OfType().Include(p=>p.Coach.ToList();
将所有部门放在一个可以序列化为JSON的列表中的方法是
var deparments = context.Departments.OfType<Finance>().Include(p => p.Manager)
.AsEnumerable()
.OfType<Department>()
.Union(
context.Departments.OfType<Sports>().Include(p => p.Coach)
).ToList();
var Departments=context.Departments.OfType().Include(p=>p.Manager)
.可计算的()
第()类
.工会(
context.Departments.OfType().Include(p=>p.Coach)
).ToList();
说明:
OfType()
:不能直接将两个列表合并。您必须将其中一个强制转换为IEnumerable
,才能Union
另一个。但是.AsEnumerable()
:如果您只执行强制转换,EF将得出结论,认为它正在处理从属部门,并且它不会接受管理器的包含。通过包含asenumerable
可以在内存中执行后续的强制转换,EF永远不会知道
Department
s,就可以在JSON中找到派生类型的所有属性。也许(如果实际模型比您展示的更复杂),您必须防止循环引用。如果
部门的数量不太多
我认为这是一个可行的选择,即使它会为延迟加载生成大量查询。您希望只能够自动导出还是也需要导入?这纯粹是为了在角度前端显示,而不是公共对象导出()
创建一个公共字符串NicePrint()
或重载到字符串()。主要问题是子类型导航属性没有立即加载,而我只获得基本类型属性。此链接可以帮助您:我现在无法测试这个问题(如果我在圣诞节开始编码,我的女朋友不会感激它),但是联合方法看起来真的很有趣!我会让你知道这是否可行。