2017-06-02 11 views
0

私のデータベースに多対多の関係があります。 Entity Frameworkでクエリを送信しています。Entity Framework多対多問合せのパフォーマンス

私のクラスはStudent,CourseおよびStudentCourseです。

public IHttpActionResult Get() 
    { 
     var data = context.Students; 

     return Ok(data); 
    } 

データベースに送信されたクエリを表示するためにクエリインターセプタを作成しました。

Intercepted on: ReaderExecuted :- IsAsync: False, Command Text: SELECT 
     [Extent1].[Id] AS [Id], 
     [Extent1].[Name] AS [Name] 
     FROM [dbo].[Student] AS [Extent1] 
    Intercepted on: ReaderExecuted :- IsAsync: False, Command Text: SELECT 
     [Extent1].[Id] AS [Id], 
     [Extent1].[Name] AS [Name] 
     FROM [dbo].[Student] AS [Extent1] 
    Intercepted on: ReaderExecuted :- IsAsync: False, Command Text: SELECT 
     [Extent2].[Id] AS [Id], 
     [Extent2].[Name] AS [Name] 
     FROM [dbo].[Course] AS [Extent1] 
     INNER JOIN [dbo].[Courses] AS [Extent2] ON [Extent1].[CourseId] = [Extent2].[Id] 
     WHERE [Extent1].[CourseId] = @EntityKeyValue1 
    Intercepted on: ReaderExecuted :- IsAsync: False, Command Text: SELECT 
     [Extent2].[Id] AS [Id], 
     [Extent2].[Name] AS [Name] 
     FROM [dbo].[Course] AS [Extent1] 
     INNER JOIN [dbo].[Courses] AS [Extent2] ON [Extent1].[CourseId] = [Extent2].[Id] 
     WHERE [Extent1].[StudentId] = @EntityKeyValue1 
.... 
... 
... 

サーバーからリレーショナルデータを取得するために14のクエリを送信します。これはデータの複数行のパフォーマンスの問題ですか?

答えて

2

あなたはレイジーローディングと呼ばれるものを見ていると思います。基本的には、すべての生徒を取得するためにクエリがDBに発行されます。次に、レスポンスが送信されると、Studentsコレクションが横断され、StudentCoursesがすべてのStudentにロードされます。その後、StudentCoursesがすべてのStudentに返されると、Courseプロパティが読み込まれ(1度に1つずつ)、返されます。

怠惰な読み込みを無効にし、熱心な読み込みを使用して学生コースとコースを学生と一緒に読み込むようにしてください。このようなもの:

context.Students.Include(s=>s.StudentCourses).Include(s=>s.StudentCourses.Select(sc=>sc.Course) 
関連する問題