2011-02-14 8 views
1

以下のSQLに基づいてLINQクエリを作成したかったのです。多くのテーブルをトラバースするためにLINQクエリを書く

基本的には、この戦略は本当に混乱しているようです。なぜMerchantGroupMerchantから始め、2つのステートメントから始めるのですか?

問題:このLINQクエリを作成する簡単な方法はありますか?ここで

var listOfCampaignsMerchantIsInvolvedIn = 
    (from merchantgroupactivity in uow.MerchantGroupActivities 
    from merchantgroupmerchant in uow.MerchantGroupMerchants 
    where merchantgroupmerchant.MerchantU.Id == merchantUIDGuid 
    select new 
    { 
     merchantgroupactivity.ActivityU.CampaignU.Id 
    }).Distinct(); 

テーブル構造である:あなたの実行計画は、部分的または完全にクエリサイズを縮小するためにビューを使用している場合でも、本当に

SELECT DISTINCT Campaign.ID 
    FROM Campaign 
    INNER JOIN Activity 
     ON (Campaign.CampaignUID = Activity.CampaignUID) 
    INNER JOIN MerchantGroupActivity 
     ON (Activity.ActivityUID = MerchantGroupActivity.ActivityUID) 
    INNER JOIN MerchantGroup 
     ON (MerchantGroup.MerchantGroupUID = MerchantGroupActivity.MerchantGroupUID) 
    INNER JOIN MerchantGroupMerchant 
     ON (MerchantGroupMerchant.MerchantGroupUID = MerchantGroup.MerchantGroupUID) 
    INNER JOIN Merchant 
     ON (Merchant.MerchantUID = MerchantGroupMerchant.MerchantUID) 
    WHERE Merchant.ID = 'M1' 
+0

ビューを作成し、Linq2Sqlを適用します。 –

+0

確かにオプションがうれしいですが、理想的には今のところすべてをLINQクエリに保存したいと考えています。 –

答えて

0

いいえ、: enter image description here

とSQL最終的には同じように見えます(また、高速/低速でも実行されます)。 5つの結合を横断しなければならない場合は、5つの結合をトラバースする必要があります。唯一の治療法は、商人とアクティビティまたはマーチャントとキャンペーンの間のリンクを導入することによってモデルを「短絡する」ことです。これを達成するには、M2Mテーブルを手動メンテナンスのコストで導入するか、検索が本当に問題でない限り、推奨しません。このクエリが遅すぎる場合は、すべての結合FKフィールドにインデックスが存在するかどうかを確認する必要があります。

+0

私はここで演技を終えたわけではありません!クエリの読みやすさ。 DBの構造は設定されているので変更できません。理想的には、より簡単なLINQクエリを使用したいと考えています... –

+0

ここではもっと簡単に行くことはできません。すでに2つのステートメント(中継経由)を使ってトリックを使用しています。文から1つを使用すると、クエリが長くなります。このLINQクエリは、複数のステートメントが何を表しているか(すべてのソースのすべてのオブジェクトのすべての組み合わせ) – mmix