2009-09-21 23 views
5

ben bir ebeveyn çocuk tablo ilişki var Katıldı. Aşağıdaki örnekte, Foo'nun bir FooID'si ve bir üst kayda işaret eden bir neblun ParentFooID vardır.Şartlı LINQ

! The Bar masa her zaman üst kaydı ile bağlantılıdır. Bu, sonucu almak için kullandığım SQL'dir.

Select * from Foo f 
JOIN Bar b 
    ON b.FooID = 
    CASE 
     WHEN f.ParentFooID is null 
     THEN f.FooID 
     ELSE f.ParentFooID 
    END 

Bunu bir LINQ sorgusuna sokmakta zorlanıyorum. Ben bir haç aşağıdaki gibi katılmak önlemek istiyorum:

var q = from f in Foo 
      from b in Bar 
      where b.FooID == (f.ParentFooID ?? f.FooID) 

Cheers

Daniel

cevap

5

Sizin spesifik bir örnek CASE kullanıyor . sadece gerçekten bir COALESCE olan boş olmayan bir değere geri düşmesine Bu durumda, bu çalışır: çevirir

var q = from f in dc.Foos 
     join 
     b in dc.Bars 
     on 
     (f.ParentFooID ?? f.FooID) 
     equals 
     b.FooID 
     into grouped 
     select grouped; 

:

SELECT ... 
FROM [dbo].[Foo] AS [t0] 
LEFT OUTER JOIN [dbo].[Bar] AS [t1] 
ON (COALESCE([t0].[ParentFooID],[t0].[FooID])) = [t1].[FooID] 
ORDER BY [t0].[FooID], [t1].[BarID] 

tuşunun sol dış joi olduğunu n COALESCE(case1, case2) üzerinde, bu yüzden ifade dönüştürücü bunu anlıyor gibi görünüyor.

0

Bazı karmaşık senaryolar iyi LINQ tarafından eşlenen değildir; Bir case'a katılmanın bunlardan biri olduğunu öneririm. Bunu çapraz birleştirme olarak yapıyorsunuz ... profilinizi aldınız mı? (Karmaşık join (TSQL vs müteakip SQLfrom from ... from ... (LINQ)) yani? Birçok durumda profilci eski tarz yaklaşımlardan) aynı (veya benzer sorgu planı satın alabilirsiniz.

+1

ben den ... senaryodan ve evet, bu (a aday olmayacağını) bir indeks taraması ne yapar hangi katılmak haç neden yok profilli var yüzden bir yapıyor özgün sorgu daha kötü gerçekleştirmek için gidiyor dizin araması – Spruce

+0

En azından değer testi. –

1

doğrudan cevap vermez ama orijinal sorgu olarak koşullu durumda olmadan daha iyi ifade edilmiş olmaz:

Select * 
from Foo f 
JOIN Bar b ON b.FooID = f.FooID 
Where f.ParentFooID is null 
UNION ALL 
Select * 
from Foo f 
JOIN Bar b ON b.FooID = f.ParentFooID 
Where f.ParentFooID is not null 

Bu durumda, LINQ ifadesi olmalı kolay?