2016-10-26 7 views
5

同じフィールドを2回含めると何が起こるのですか?つまり、エンティティをdbから取り、EF .includeオプションを使用します。私は何を意味することはこれです:私が持っている
同じフィールドをエンティティのフレームワークに2回含む場合の動作linq

.Include(x => x.Student) 
.Include(x => x.Car) 
.Include(x => x.Student) 

これはモデルです:ので、学生二回(私の人はONLY学生を持っているので)(誤って)を含むことにより、

Person has a Student 
Person has a car 

、問題はありますか?
P.私はそれが一度含まれてほしい!私は1人の学生しかいないからです。 これについてefが文句を言っていますか?私はそれを試してみたが、それは大丈夫だったようだが、私はこのことの意味を知らない。誰も説明することができます/精巧?少しは検索しましたが、問題を特定できませんでした。

+0

私はそこに問題はないはずだと思っていますが、あなたはそれを実際にそのように使うことになっています。私はその文書を見つけようとします。 – Zack

+0

私の主張は、私は学生だけが必要だということです。基本エンティティは人であるため、1人の生徒がいます。 –

答えて

4

は、このサンプルを取る:

public class RentContext : DbContext 
{ 
    public DbSet<Student> Students { get; set; } 

    public DbSet<Rent> Rents { get; set; } 

    public DbSet<Car> Cars { get; set; } 
} 

public class Car 
{ 
    public int Id { get; set; } 

    public string Model { get; set; } 

    public double Price { get; set; } 
} 

public class Rent 
{ 
    public int Id { get; set; } 

    public Student Student { get; set; } 

    public Car Car { get; set; } 
} 

public class Student 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public int Year { get; set; } 
} 

家賃は学生や車が含まれています。

var rents = ctx.Rents 
    .Include(x => x.Student) 
    .Include(x => x.Car) 
    //.Include(x => x.Student) 
    .ToList(); 

これで生成されたSQL::

SELECT 
[Extent1].[Id] AS [Id], 
[Extent2].[Id] AS [Id1], 
[Extent2].[Name] AS [Name], 
[Extent2].[Year] AS [Year], 
[Extent3].[Id] AS [Id2], 
[Extent3].[Model] AS [Model], 
[Extent3].[Price] AS [Price] 
FROM [dbo].[Rents] AS [Extent1] 
LEFT OUTER JOIN [dbo].[Students] AS [Extent2] ON [Extent1].[Student_Id] = [Extent2].[Id] 
LEFT OUTER JOIN [dbo].[Cars] AS [Extent3] ON [Extent1].[Car_Id] = [Extent3].[Id] 

のは、複製クエリがインクルードしてみましょう:

var rents = ctx.Rents 
    .Include(x => x.Student) 
    .Include(x => x.Car) 
    .Include(x => x.Student) 
    .ToList(); 

あなた」

はユニークな句を含めると、クエリを作ることができますこのSQLを取得します:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent2].[Id] AS [Id1], 
[Extent2].[Name] AS [Name], 
[Extent2].[Year] AS [Year], 
[Extent3].[Id] AS [Id2], 
[Extent3].[Model] AS [Model], 
[Extent3].[Price] AS [Price] 
FROM [dbo].[Rents] AS [Extent1] 
LEFT OUTER JOIN [dbo].[Students] AS [Extent2] ON [Extent1].[Student_Id] = [Extent2].[Id] 
LEFT OUTER JOIN [dbo].[Cars] AS [Extent3] ON [Extent1].[Car_Id] = [Extent3].[Id] 

EFは、インクルードを複数回指定しても同じSQLを生成できるほどスマートです。

UPDATE:繰り返し(何度も)が含ま

のは、これを試してみましょう:繰り返し

var rents = ctx.Rents 
    .Include(x => x.Student) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Car) 
    .Include(x => x.Student) 
    .Include(x => x.Student) 
    .Include(x => x.Student) 
    .Include(x => x.Student) 
    .Include(x => x.Student) 
    .Include(x => x.Student) 
    .Include(x => x.Student) 
    .Include(x => x.Student) 
    .Include(x => x.Student) 
    .Include(x => x.Student) 
    .Include(x => x.Student) 
    .Include(x => x.Student) 
    .Include(x => x.Student) 
    .ToList(); 

が含まれ、いくつかの回。そして、生成されたSQLは次のとおりです。

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent2].[Id] AS [Id1], 
    [Extent2].[Name] AS [Name], 
    [Extent2].[Year] AS [Year], 
    [Extent3].[Id] AS [Id2], 
    [Extent3].[Model] AS [Model], 
    [Extent3].[Price] AS [Price] 
    FROM [dbo].[Rents] AS [Extent1] 
    LEFT OUTER JOIN [dbo].[Students] AS [Extent2] ON [Extent1].[Student_Id] = [Extent2].[Id] 
    LEFT OUTER JOIN [dbo].[Cars] AS [Extent3] ON [Extent1].[Car_Id] = [Extent3].[Id] 

もう一度同じコードを再度入力します。あ、はい。ちょっと変わったことはありますが、それは大丈夫でしょう。

希望すると便利です。

+0

したがって、同じエンティティを(たとえば: '.Include(x => x.Student)'のように)含めるとしても、efはそれを一度だけ組み込み、一度しか含まれていない学生と対応するsqlを生成しますか? –

+0

@firstlast –

+0

ありがとうございました!これは本当に重大な答えです。 学生のために大学を含める場合は、 'を実行できますか?インクルード(x => (x => x.Student.University) 'をインクルードするか、単純に1つのインクルード、つまり' .Include(x => x.Student.University) 'に行くことができますか?学生が含まれている必要がありますが、すべてのエンティティではありません(私は大学が必要です)。 –

2

これを2回呼び出すと、同じクエリが生成されます。同じ結果、このような何か

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Title] AS [Title], 
    [Extent1].[PersonId] AS [PersonId], 
    [Extent2].[Id] AS [Id1], 
    [Extent2].[Name] AS [Name] 
    FROM [dbo].[Books] AS [Extent1] 
    INNER JOIN [dbo].[People] AS [Extent2] ON [Extent1].[PersonId] = [Extent2].[Id] 
1

これは完全に有効で、とにかくEFを上回らないでしょう。 Studentのような参照を取り除く追加の参照とコレクションをどのように含めるかを検討してください。このように書くかもしれません。あなたが提案したことは、以下の例よりもEFを混乱させることはありません。

.Include(x => x.Student.Teacher) 
.Include(x => x.Car) 
.Include(x => x.Student.DrivingLog) 
関連する問題