2011-12-18 7 views
4

私は2つのクラス: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 

「魔法」LEFTによって強制結果なし条件よりも少ないに参加して、行を探すことですJOIN。

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

+1

おそらくあなたはその解決策を受け入れることができますか? – Arion

0

あなたはエンティティへのLINQのでクエリを最適化する

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やwhere t == nullのようないくつかの変更を加えなければならなかったのですが、それ以外にはその点がありました!ありがとう! – user1104938

+0

グルーピングクエリは非常に遅いため、グループの各キーに対して別々に実行します –

1

次のようにこれを行うことができます参加し、 Entity FrameworkがクエリをSQLに変換し、その結果をオブジェクトにマップするために必要な作業についても理解する必要があります。

Linq To EntitiesクエリをSQLクエリと直接比較すると、Entity Frameworkがより多くの作業を行うため、パフォーマンスが低下します。

したがって、Entity Frameworkの手順を最適化することも検討することが重要です。助けることができる

物事:データベース接続

  • を開こうとした時、

    • プリコンパイルクエリ
    • 事前生成景色
    • は自分で決めるトラッキングを無効に(適切な場合)
    パフォーマンス戦略を備えた

    Here you can find some documentation

  • +0

    ありがとう、私はそれをSQLプロファイラを使用して比較します。それはMMSの権利と比較すると可能な限り公平にする必要がありますか? – user1104938

    +0

    結果のSQLクエリを見て、あなたの手書きSQLへのSQL部分だけの実行時間を測定しているなら、それは私が考えると公平でなければなりません:) –

    関連する問題