Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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# TPH继承中子类型的LINQ.Include()属性_C#_Json_Linq_Inheritance - Fatal编程技术网

C# TPH继承中子类型的LINQ.Include()属性

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

我正在实体框架中使用每层次表(TPH)继承。现在我想得到一个部门列表,在这个例子中,部门可以是一个子类型。我希望集合中的项目包括它们自己的自定义属性,而不仅仅是基本模型的属性

我怎样才能做到这一点

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()
    或重载到字符串()。主要问题是子类型导航属性没有立即加载,而我只获得基本类型属性。此链接可以帮助您:我现在无法测试这个问题(如果我在圣诞节开始编码,我的女朋友不会感激它),但是联合方法看起来真的很有趣!我会让你知道这是否可行。