2011-06-29 94 views
0

我有這個查詢在Books,TradingDesks和ProductInfos上運行聯接。LINQ to SQL幫助

var queryjoin = from b in books.values 
       join d in tradingdesks 
        on b.tradingdeskid equals d.id 
       **join p in productinfoss** 
        on b.id equals p.riskbookid 
       select new { p, book = b.name, tradingdeskname = d.name }; 

在過去的加入,我想這樣做與產品一個右外連接。我正在嘗試不使用動態SQL查詢,並嘗試使用linq本身的工作。我不想使用,因爲這會極大地影響性能。我之前嘗試過將對象轉換爲對象,但是無法獲得正確的性能,現在嘗試將linq轉換爲sql,但仍然無法實現。 LINQ Query Help。任何幫助是極大的讚賞。

回答

1

試試這個(檢查的productinfos(s)錯字):

編輯:對不起,我給你的左外連接。右外部連接在Linq中不可用,因此您需要稍微重新設置查詢的格式。

var queryjoin = from p in productinfos 
       join b in books.values 
        on p.riskbookid equals b.id into outer 
       from o in outer.DefaultIfEmpty() 
       join d in tradingdesks 
        on o.tradingdeskid equals d.id 
       select new { 
         p, 
         book = (o==null) ? "(no book name)" : o.name, 
         tradingdeskname = d.name 
         }; 
+0

是不是這個左外連接等效? –

+0

是的,對不起,你是對的!它需要重新排序到左外連接(或者您可以使用組)。掛上... –

1

請嘗試以下

var queryjoin = from p in productinfoss 
       join b in books.values on p.riskbookid equals b.id into temp 
       from t in temp.DefaultIFEmpty() 
       join d in tradingdesks on 
       t.tradingdeskid equals d.id 
       new { p, book = t==null?"no name":t.name, tradingdeskname = d.name }; 

應該在這種情況下工作。我還沒有測試,但

+0

沒有。這不會產生預期的結果。在我的初步查詢中,我將獲得所有產品 –

+0

這就是您通過在產品上採用正確的外連接而獲得的所有產品。 –

+0

--- Yours ----- SELECT DISTINCT [t0]。[Family] FROM [EVF_TradeService]。[dbo]。[Product] AS [t0] LEFT OUTER JOIN [EVF_HierarchyService]。[dbo]。[Book] AS [t1] ON [t0]。[RiskBookId] = [t1]。[Id] INNER JOIN [EVF_HierarchyService]。[dbo]。[TradingDesk] AS [t2] ON [t1]。[TradingDeskId] = [t2]。[Id] ---------------------------------- ---------------------------------- –