2011-12-18 88 views
4

我有兩個類:Property和PropertyValue。屬性具有多個值,其中每個值都是新修訂版。如何提高LINQ到EF的性能

當檢索一組屬性時,我想包含每個屬性值的最新版本。

在T-SQL中,可以非常有效地完成這樣的:

SELECT 
p.Id, 
pv1.StringValue, 
pv1.Revision 
FROM dbo.PropertyValues pv1 
LEFT JOIN dbo.PropertyValues pv2 ON pv1.Property_Id = pv2.Property_Id AND pv1.Revision < pv2.Revision 
JOIN dbo.Properties p ON p.Id = pv1.Property_Id 
WHERE pv2.Id IS NULL 
ORDER BY p.Id 

「魔術師」在此查詢是加入上比條件較小,查找行,而不由左強迫的結果加入。

如何使用LINQ to EF來實現類似的功能?

我能想出的最好的事情是:

from pv in context.PropertyValues 
group pv by pv.Property into g 
select g.OrderByDescending(p => p.Revision).FirstOrDefault() 

它不會產生正確的結果,但比其他慢10倍左右。

回答

1

也許這可以提供幫助。其中db是數據庫方面:

(
      from pv1 in db.PropertyValues 
      from pv2 in db.PropertyValues.Where(a=>a.Property_Id==pv1.Property_Id && pv1.Revision<pv2.Revision).DefaultIfEmpty() 
      join p in db.Properties 
       on pv1.Property_Id equals p.Id 
      where pv2.Id==null 
      orderby p.Id 
      select new 
      { 
       p.Id, 
       pv1.StringValue, 
       pv1.Revision 
      } 
    ); 
+0

這個效果非常好!謝謝!! – user1104938 2011-12-19 08:28:40

+1

也許你可以接受解決方案嗎? – Arion 2011-12-19 09:01:48

0
,如果你要使用多個條件(而不是表達降低)

捧場,你可以做到這一點像

from pv1 in db.PropertyValues 
join pv2 in db.PropertyValues on new{pv1.Property_ID, Condition = pv1.Revision < pv2.Revision} equals new {pv2.Property_ID , Condition = true} into temp 
from t in temp.DefaultIfEmpty() 
      join p in db.Properties 
       on pv1.Property_Id equals p.Id 
      where t.Id==null 
      orderby p.Id 
      select new 
      { 
       p.Id, 
       pv1.StringValue, 
       pv1.Revision 
      } 
+0

你是男人!我不知道DefaultOrEmpty()會產生一個LEFT JOIN。當你考慮它時,這很明顯。必須做一些像pv1.Property.Id和其中t == null,但除了它的位置上的變化!謝謝! – user1104938 2011-12-19 08:27:05

+0

分組查詢非常慢,因爲它爲組的每個鍵單獨執行 – 2011-12-19 09:41:31

1

下一頁優化中的LINQ查詢的實體,您還必須瞭解Entity Framework將查詢轉換爲SQL所需的工作,然後將結果映射回您的對象。

將Linq To Entities查詢直接比較爲SQL查詢總是會導致性能下降,因爲Entity Framework爲您做了很多工作。

因此,查看優化實體框架所採用的步驟也很重要。

事情可以幫助:

  • 預編譯查詢
  • 預生成視圖
  • 自己決定何時開放數據庫連接
  • 禁用跟蹤(如適用)

Here you can find some documentation具有性能策略。

+0

謝謝,我使用sql分析器比較它。與MMS對比時,這應該儘可能公平嗎? – user1104938 2011-12-19 08:24:54

+0

如果您正在查看生成的SQL查詢並測量只有SQL部分的執行時間到您的手寫SQL,它應該是公平的我想:) – 2011-12-19 08:39:30