2017-03-07 129 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