它适用于健身中心管理应用程序
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"
请问有什么问题,或者如何解决这个问题?
感谢
答案 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并不总是最好的,但这取决于您的业务需求