2017-06-02 40 views
0

我在我的數據庫中有多對多的關係。我正在用實體框架發送一個查詢。實體框架多對多查詢性能

我的課程是Student,CourseStudentCourse

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

我想你會看到所謂的延遲加載。基本上會發生的是一個查詢發佈到數據庫獲取所有的學生。然後,當發送迴應時,學生系列將被遍歷,並且StudentCourses將被加載到每個學生,一次一個查詢。然後,當每個學生髮回StudentCourses時,Course屬性將被加載(再一次一個)並被髮回。

您應該嘗試禁用延遲加載並使用熱切加載將StudentCourses和Courses與學生一起加載。類似這樣的:

context.Students.Include(s=>s.StudentCourses).Include(s=>s.StudentCourses.Select(sc=>sc.Course)