2011-02-14 43 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(); 

這裏是表結構: enter image description here

和SQL:

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

沒有,真的沒有,即使你使用視圖來部分或完全減少查詢量的執行計劃在最後仍然看起來是一樣的(並且執行得像快/慢一樣)。如果您必須遍歷5個連接,那麼您必須遍歷5個連接,唯一的辦法是通過引入說商家和活動或商家和活動之間的鏈接來「縮短」模型。你可以通過在它們之間引入M2M表來實現這一點(以手動維護爲代價),但我不會推薦它,除非檢索是一個真正的問題。如果這個查詢太慢,你應該檢查所有連接FK字段上是否存在索引。

+0

我不是在這裏表演後!查詢的可讀性。數據庫的結構已設置,因此無法更改。理想情況下,我想要一個更簡單的LINQ查詢... –

+0

好吧,我不認爲你可以在這裏做任何簡單的事情,你已經使用了兩個來自語句的技巧(通過中介),否則你需要在連接中指定如果使用語句中的一個,從而使查詢更長。如果您知道多個來自語句的表達(每個來自所有來源的所有對象的每個組合),那麼您擁有的LINQ查詢非常易讀, – mmix