LINQ中的条件连接

Spr*_*uce 5 .net c# conditional join linq-to-sql

我有一个父子表关系.在下面的示例中,Foo有一个FooID和一个可空的ParentFooID,它指向父记录.

Bar表始终链接到父记录.这是我用来获取结果的SQL.

Select * from Foo f
JOIN  Bar b
  ON b.FooID =  
     CASE 
       WHEN f.ParentFooID is null
         THEN f.FooID
       ELSE f.ParentFooID
     END
Run Code Online (Sandbox Code Playgroud)

我在进入LINQ查询时遇到了一些麻烦.我想避免像以下那样的交叉连接:

    var q = from f in Foo 
            from b in Bar 
            where  b.FooID == (f.ParentFooID ?? f.FooID)
Run Code Online (Sandbox Code Playgroud)

干杯,

丹尼尔

Rex*_*x M 5

您的具体示例CASE用于回退到非null值,这实际上只是一个COALESCE.在这种情况下,这工作:

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

这转化为:

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]
Run Code Online (Sandbox Code Playgroud)

关键是左外连接COALESCE(case1, case2),因此表达式转换器似乎明白这一点.