2017-09-14 89 views
-1

我使用C#實體框架,並已下面的方法來計算我的學生包括影響Count的性能嗎?

public static int GetStudentCount() 
{ 
    using(SchoolContext ctx = new SchoolContext()) 
    { 
     return ctx.Student.Include("Subjects").Include("Subjects.SubjectsDescription").Include("Teacher").Count(); 
    } 
} 

問題的: 是否有性能差異,以這種方法嗎?

public static int GetStudentCount() 
{ 
    using(SchoolContext ctx = new SchoolContext()) 
    { 
     return ctx.Student.Count(); 
    } 
} 

更新:由於一些用戶想知道爲什麼加入Include()在所有 - 我想重用與藪過濾器的方法。所以,我有一個方法來獲取所有學生GetStudent,並使用相同的代碼來過濾數據,只是返回統計數(用於數據庫分頁)

public static int GetStudentCount(Filter f) 
{ 
    using(SchoolContext ctx = new SchoolContext()) 
    { 
     return GetStudents(ctx.Student.AsQueryable(),f).Count(); // has filters an Include() 
    } 
} 
+1

測試一下,看看。 –

+0

@GiladGreen它很難測試,因爲SQL有緩存,我沒有足夠的數據來注意不同之處 – Toshi

+1

@Toshi - 它影響的答案是「是」 - 添加包含創建連接。但正確的做法只是測試 - 爲此 - 填充數據,執行大量時間的查詢並做一個平均數(如果可以,使用數據庫屬性進行緩存) –

回答

2

要測試的區別我執行下面的代碼和日誌的一種方法對我的oracle數據庫生成查詢。

var context = new DbContext(); 
context.Database.Log = Log; 
var count = context.TBCO_CATEGORY.Count(); 

的生成查詢是

SELECT 
"GroupBy1"."A1" AS "C1" 
FROM (SELECT 
    COUNT(1) AS "A1" 
    FROM "SIMS"."TBCO_CATEGORY" "Extent1" 
) "GroupBy1" 

然後我執行下面的代碼

var context = new SIMSContext(); 
context.Database.Log = Log; 
var count = context.TBCO_CATEGORY.Include(x=>x.TBCO_ITEM).Count(); 

的生成SQL是:

SELECT 
"GroupBy1"."A1" AS "C1" 
FROM (SELECT 
    COUNT(1) AS "A1" 
    FROM "SIMS"."TBCO_CATEGORY" "Extent1" 
) "GroupBy1" 

這意味着相同的SQL語句,以便同執行計劃。