实体-框架多表查询
本文关键字:查询 框架 实体 | 更新日期: 2023-09-27 18:11:32
我的代码大约需要3秒来执行60名员工,这是可怕的性能。我想我的代码在大约0.5秒最大运行。我有一个方法,需要5表在我的数据库。因为你只能在你的查询.include("AdjescentTable")
,我必须做3个查询,取他们的结果,并将它们添加到我的Employee
。
var feuilleDeTemps = from fdt in context.FT.Include("FTJ") where
(fdt.ID_Employe == employe.ID_Employe) &&
(fdt.DateDepart <= date) &&
(fdt.DateFin >= date)
select fdt;
var horaireEmploye = from h in context.HR
where h.ID_Employe == employe.ID_Employe
select h;
var congeCedule = from cc in context.CC.Include("C")
where (cc.ID_Employe == employe.ID_Employe &&
cc.Date <= dateFin &&
cc.Date >= dateDebut)
select cc;
Employe.FeuilleDeTemps = feuilleDeTemps;
Employe.horaireEmploye = horaireEmploye;
Employe.congeCedule = congeCedule;
return Employe;
上面的3个查询每60次执行大约需要0.7秒,而且我的数据库没有很多行。对于这3个查询的集合,我返回1 FT 7 FTJ, 5 HR, 0-5 CC和0-5 c。FT中大约有300行,FTJ中有1.5k行,HR中有500行,CC中有500行,c中有500行。
当然这些不是真实的名字,但我把它们写得更短,以便更清晰。
我使用DateTime.Now
和TimeSpans来确定每个查询的时间。如果我直接在SQL Server上运行3个查询,它们大约需要300毫秒。
Select e.ID_Employe, ft.*, ftj.* FROM Employe e
INNER JOIN FeuilleDeTemps ft
ON e.ID_Employe = ft.ID_Employe
INNER JOIN FeuilleDeTempsJournee ftj
ON ft.ID_FeuilleDeTemps = ftj.ID_FeuilleDeTemps
WHERE ft.DateDepart >= '2011-09-25 00:00:00.000' AND ft.DateFin <= '2011-10-01 23:59:59.000'
Select e.ID_Employe, hr.* FROM Employe e
INNER JOIN HoraireFixeEmployeParJour hr
ON hr.ID_Employe = e.ID_Employe
Select e.ID_Employe, cc.* FROM Employe e
INNER JOIN CongeCedule cc
ON cc.ID_Employe = e.ID_Employe
INNER JOIN Conge c
ON c.ID_Conge = cc.ID_Conge
我们使用WCF,实体框架和LINQ
为什么要花这么多时间在实体框架上,我该如何改进它?
一堆没有答案的问题:
你确定你需要你所选择的所有字段来做你想要的工作吗?是否存在可以延迟加载以减少前置查询数量的子节点?
如果在会话期间多次运行此代码会发生什么?它的性能会随着时间的推移而提高吗?如果是这样,您可能需要考虑将一些查询更改为使用编译查询,这样EF就不需要每次都重复地将表达式树解析为TSQL(注意:使用4.2,这将自动为您完成)。
我假设您已经对应用程序进行了概要分析,以确保没有运行您不期望的其他查询。另外,我希望您已经通过查询分析器运行了概要跟踪,以确保表上存在适当的索引。