0

私はSQLデータベース(まだかなり新しい)を使用しており、「一対一」またはサブテーブルのスーパーテーブル関係を作成しようとしました。私は C# と LINQ-to-Entities を使用しています。

一般的な例として、3 つのテーブルがあります。

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

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

Teacher:
PersonId, PrimarySubject, YearsAtSchool, IsCoach, ....

私ができるようにしたいのは、Person に基づいてクエリを実行し、関連するサブタイプ データも取得することです。関係を確実にするために、関連する TypeId テーブルがあります。

Person にクエリを実行し、その人が学生だったとします。取得したいのは次のとおりです。

QueriedResult
PersonId, Age, p1, ..., pn, Grade, GPA, s1, ..., Sn 

残念ながら、私の場合はサブテーブルと要素が多すぎるため、select new {p.PersonID, etc} を実行することはできません。

コードを使用するたびに、2 つの別々のテーブルの IEnumerable を取得します。私が提供するサンプル コードは、関連付けられた学生がいない場合は null を返し、その人物が学生の場合は 2 番目の列にテーブルを返します。

var query = (from p in Persons.AsEnumerable()
join s in Students on p.PersonId equals s.PersonId
select new {p, s});

「フラット化」について多くの話を聞いたことがありますが、提案されたすべての方法では、 p と s が同じテーブルタイプである必要があるようです。

ありがとう、

4

1 に答える 1

0

継承のモデル化に苦労しています。両方ともStudentsです。継承されたクラスをリレーショナル データベースに格納するにはいくつかの方法があり、エンティティ フレームワークはこれらをサポートしています。TeacherPerson

おそらく最も役立つアプローチはTable per Concrete Type (TPC)と呼ばれるものです。これは、各型がデータベースに独自のテーブルを持ち、EF が適切なテーブルにサブタイプを格納することを意味します。このリンクは、他の 2 つの一般的なアプローチ (TPH と TPT) にも言及しています。サブクラスに比較的多くの共通点がある場合は、TPT も適切な場合があります。

だからあなたは持っているでしょう

abstract class Person { PersonId, ... }

class Student : Person { Grade, ... }

class Teacher: Person { PrimarySubject, ... }

あなたが望むなら、Studentあなたはそうします

context.Persons.OfType<Student>().Where(....

これQueriedResultにより、意図したとおりの結果が得られます。

Person抽象的であることに注意してください。具体的なものにしたい場合は、 とPersonBaseのように、抽象クラス (など) を作成し、そこから派生PersonさせStudentたほうがよいでしょうTeacher

于 2012-04-13T23:09:13.017 に答える