2010-02-24 96 views
4

通過下面的查詢,我正在進行多個連接並將它們全部選中。我想把這個結果返回到一個列表中,所以在這種情況下,我將有一個List,其數目爲3,假設有三個地址與這個單一的客戶ID順序相關聯......現在查詢可以工作,但是我把exp .ToList()它給了我一個基本的二維列表(一個列表中有一個元素,其中這個元素是一個3個元素的類型列表,我敢肯定有一個很好的方法可以做到這一點...想法?多個連接到一個列表中

var exp = (

     from t in this.reposOrders.All() 

     join p1 in this.reposAddress.All() 
     on t.AddressPrimary equals p1.AddressID into pp1 
     from p1 in pp1.DefaultIfEmpty() 

     join p2 in this.reposAddress.All() 
     on t.AddressSecondary equals p2.AddressID into pp2 
     from p2 in pp2.DefaultIfEmpty() 

     join p3 in this.reposAddress.All() 
     on t.AddressThird equals p3.AddressID into pp3 
     from p3 in pp3.DefaultIfEmpty() 

     where t.CustomerID == customerID 

     select new { p1, p2, p3 } 
    ); 

回答

0

你想要做什麼,從正常化遭受較差; AddressPrimary,AddressSecondary和AddressThird不應該是常規的領域(我是從喲假設訂單你的行from t in this.reposOrders.All()),但應包含在弱實體或連接表中。

這就是說,你可能可以得到你想要用下面的查詢內容:

var primary = from t in this.reposOrders.All() where t.CustomerID == customerID select t.AddressPrimary; 
var secondary = from t in this.reposOrders.All() where t.CustomerID == customerID select t.AddressSecondary; 
var tertiary = from t in this.reposOrders.All() where t.CustomerID == customerID select t.AddressThird; 
var ids = primary.Union(secondary).Union(tertiary); 
var addresses = from a in this.reposAddress.All() where ids.Contains(a.AddressID) select a; 
+0

感謝您正常化的批評,但我不同意。 – Gabe 2010-02-24 21:11:12

+0

對我來說這句話很糟糕,對不起。雖然我確實相信使用連接表會更好。 您是否嘗試過我制定的方法?它基本上將您的主要,次要和第三級地址摺疊爲一個ID列表,然後查詢它們以獲取您想要的地址。因爲LINQ被推遲執行,所以直到調用ToList()之前,您都不會實際進行迭代。 – Randolpho 2010-02-24 21:25:42