[英]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.