簡體   English   中英

慢速實體框架查詢,但快速生成SQL

[英]slow entity framework query , but fast Generated SQL

請考慮這個模型 在此處輸入圖片說明

這是一個健身中心管理應用程序

ADHERANT是成員表

INSCRIPTION是訂閱表

SEANCE是個人會話表

seance表包含很少的行(大約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"

對發生的事情有什么想法,或者如何解決?

謝謝

它需要一些研究來優化此:

如果您忽略了從db到服務器的數據傳輸,則由於Ivan 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 Conversion,所有記錄將被傳輸到服務器,然后將計算條件

盡管使用IQuerable並非總是最好的方法,但這取決於您的業務需求

對於更多的參考檢查這個這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM