慢实体框架查询,但快速生成SQL

时间:2017-03-07 17:34:59

标签: sql performance entity-framework

请考虑这个模型 enter image description here

它适用于健身中心管理应用程序

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"

请问有什么问题,或者如何解决这个问题?

感谢

1 个答案:

答案 0 :(得分:0)

需要一些研究来优化这一点:

如果忽略从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转换,所有记录都将传输到服务器,然后计算条件

尽管使用IQuerable并不总是最好的,但这取决于您的业务需求

了解更多参考资料,请检查thisthis