2011-06-29 95 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] ---------------------------------- ---------------------------------- –