Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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# LINQ Select New从超级类型子类型关系创建一个表_C#_Join_Linq To Entities_Relational Database - Fatal编程技术网

C# LINQ Select New从超级类型子类型关系创建一个表

C# LINQ Select New从超级类型子类型关系创建一个表,c#,join,linq-to-entities,relational-database,C#,Join,Linq To Entities,Relational Database,我使用的是一个SQL数据库,对它来说还是相当新的,并尝试创建一对一或子表-超表关系。我使用C和LINQ来创建实体 作为一个常见的例子,我有3个表 Person: PersonId, Age, p1, p2, ..., pn Student: PersonId, Grade, GPA, s1, s2, ...., sn Teacher: PersonId, PrimarySubject, YearsAtSchool, IsCoach, .... 我希望能够基于Person进行查询,然后获得相

我使用的是一个SQL数据库,对它来说还是相当新的,并尝试创建一对一或子表-超表关系。我使用C和LINQ来创建实体

作为一个常见的例子,我有3个表

Person:
PersonId, Age, p1, p2, ..., pn

Student:
PersonId, Grade, GPA, s1, s2, ...., sn

Teacher:
PersonId, PrimarySubject, YearsAtSchool, IsCoach, ....
我希望能够基于Person进行查询,然后获得相关的子类型数据。我有relevatn TypeId表来确保关系

假设我询问一个人,他们是学生,那么我想得到:

QueriedResult
PersonId, Age, p1, ..., pn, Grade, GPA, s1, ..., Sn 
不幸的是,选择新的{p.PersonID等}是不可行的,因为在我的例子中有太多的子表和太多的元素

每当我使用代码时,我都会得到两个独立表的IEnumerable。我提供的示例代码在没有关联的student时返回null,如果此人是student,则在第二列中返回一个表

var query = (from p in Persons.AsEnumerable()
join s in Students on p.PersonId equals s.PersonId
select new {p, s});
我听过很多关于“扁平化”的讨论,尽管所有建议的方法似乎都要求p&s采用相同的表格类型


谢谢,

您正在为继承建模而挣扎。学生和老师都是人。在关系数据库中存储继承类有几种方法,实体框架支持这些方法

最有帮助的方法是调用,这意味着每个类型在数据库中都有自己的表,而EF负责将子类型存储在正确的表中。该链接还引用了另外两种commmon方法TPH和TPT。如果您的子类有相对多的共同点,那么TPT也可能是合适的

所以你会

abstract class Person { PersonId, ... }

class Student : Person { Grade, ... }

class Teacher: Person { PrimarySubject, ... }
如果你想要学生,你就需要

这将按预期提供QueriedResult结果


注意,人是抽象的。如果你希望它是具体的,你最好创建一个抽象的PersonBase类或类似的类,并从中派生Person,就像学生和老师一样。

这对我来说很有意义。在我的例子中,Person与其他表有很多关系,并且有5个子类型。在TPC中,我会将5个子表中的每一个子表连接到Person的每个连接表吗?链接太棒了!是的,这是您通常对子类型执行的操作。我必须说,子类型是伟大的,但包括我在内的许多人喜欢组合而不是继承。如果你在上面搜索,你会被大量的链接淹没。从著名的设计模式创始人GoF开始。
context.Persons.OfType<Student>().Where(....