2017-03-07 86 views
0

請考慮這種模式 enter image description here緩慢的實體框架查詢,可快速生成SQL

它是一個健身中心管理應用

ADHERANT是成員表

題詞是預訂表

SEANCE是各個會話表

的降神表含有非常FEWS行(大約7000)

現在查詢:

var q = from n in ctx.SEANCES 
       select new SeanceJournalType() 
         { 
          ID_ADHERANT = n.INSCRIPTION.INS_ID_ADHERANT, 
          ADH_NOM = n.INSCRIPTION.ADHERANT.ADH_NOM, 
          ADH_PRENOM = n.INSCRIPTION.ADHERANT.ADH_PRENOM, 
          ADH_PHOTO = n.INSCRIPTION.ADHERANT.ADH_PHOTO, 
          SEA_DEBUT = n.SEA_DEBUT 
         }; 

       var h = q.ToList(); 

此採取3秒左右至極爲永恆, 產生的相同SQL查詢幾乎是瞬間的

SELECT 
1 AS "C1", 
"C"."INS_ID_ADHERANT" AS "INS_ID_ADHERANT", 
"E"."ADH_NOM" AS "ADH_NOM", 
"E"."ADH_PRENOM" AS "ADH_PRENOM", 
"E"."ADH_PHOTO" AS "ADH_PHOTO", 
"B"."SEA_DEBUT" AS "SEA_DEBUT" 
FROM "TMP_SEANCES" AS "B" 
LEFT OUTER JOIN "INSCRIPTIONS" AS "C" ON "B"."INS_ID_INSCRIPTION" = "C"."ID_INSCRIPTION" 
LEFT OUTER JOIN "ADHERANTS" AS "E" ON "C"."INS_ID_ADHERANT" = "E"."ID_ADHERANT" 

有什麼想法發生了什麼事情,或者如何解決這個問題?

感謝

+0

你在什麼版本的EF上?還要注意'ToList'不僅執行查詢,還會消耗結果(讀取值並填充對象),所以對於7K記錄,3秒就可以。 –

+0

我首先使用EF DB 6。13 – user2475096

+0

的事情是,等效生成的SQL查詢是即時的? – user2475096

回答

0

它需要一些研究來優化這個:

如果你忽略從數據庫到服務器的數據傳輸則 伊凡Stoev建議調用ToList方法是昂貴的部分

爲提高性能,取決於你的需要:

1.如果您需要添加,刪除在服務器端它的功能可能是最好堅持使用列表

2.如果不需要添加 - 刪除然後再考慮ICollection的,,甚至更好

3.如果你有更多的條件,將自定義查詢更加充分利用IQuerable

定製像基於條件選擇單個記錄查詢:

var q = from n in ctx.SEA.... // your query without ToList() 
q.where(x=>"some condition") //let`s say x.Id=1 

只有一個記錄將被從數據庫傳送到服務器

但與ToList轉換的所有記錄將被轉移到服務器則條件將被計算

雖然它並不總是最好使用IQuerable它取決於你的業務需求

更多的參考檢查thisthis