2011-10-18 73 views
2

我的代碼大約需要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毫秒。

這裏是我的SQL查詢:

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

這是爲什麼需要這麼多時間在實體框架和我怎麼能提高呢?

+0

如果您將所有內容縮寫爲三個或更少的字母,您的問題可能會變得更加清晰。:-P –

+0

(無需瞭解框架的任何內容...)是否有某些原因導致您無法執行多個'在你的框架查詢中加入'或'includes'?另外,如何做一個單一的視圖,你可以創建你的實體?如果你沒有更新任何東西,這可能會簡化一點點... –

回答

2

一大堆的問題有沒有答案:

你確定你需要的一切你選擇做你想要工作的領域?是否有任何孩子可以懶惰加載以減少預先查詢的數量?

如果在會話期間多次運行此代碼會發生什麼?隨着時間的推移,它會不會增加性能如果是這樣,您可能需要考慮更改一些查詢以使用編譯查詢,以便EF無需每次都將表達式樹重複解析爲TSQL(注意:使用4.2時,這將自動完成)。

我假設你已經對應用程序進行了剖析,以確保沒有其他查詢正在運行,但你並不期待。另外,我希望您已通過查詢分析器運行配置文件跟蹤,以確保表中存在適當的索引。

+0

我需要所有的字段,我不能lazyload,因爲我必須將數據返回到我的應用程序。你看到的代碼是在WCF服務中,如果我運行代碼ser次,它從大約0.2秒減少,但它不是恆定的。 – Gab

+1

嘗試在你的LINQ/EF上編譯查詢,看看是否有幫助。你的性能問題的一部分可能是EF的查詢過期和SQL的查詢計劃過期。恐怕這裏可能沒有銀彈,你需要對這個進行大量的分析。 –

+0

我會肯定會嘗試編譯查詢和做更多的分析,thnx爲提示^^ – Gab