I have a parent child table relationship. In the example below Foo has a FooID and a nullable ParentFooID that points to a parent record.
The Bar table is always linked to the parent record. This is the SQL I use to get the result.
Select * from Foo f
JOIN Bar b
ON b.FooID =
CASE
WHEN f.ParentFooID is null
THEN f.FooID
ELSE f.ParentFooID
END
I'm having a bit of trouble getting this into a LINQ query. I'd like to avoid a cross join like the following:
var q = from f in Foo
from b in Bar
where b.FooID == (f.ParentFooID ?? f.FooID)
Cheers,
Daniel
Your specific example is using CASE to fall back to a non-null value, which is really just a COALESCE. In which case, this works:
var q = from f in dc.Foos
join
b in dc.Bars
on
(f.ParentFooID ?? f.FooID)
equals
b.FooID
into grouped
select grouped;
Which translates into:
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]
The key is the left outer join on COALESCE(case1, case2), so the expression converter does seem to understand that.
Doesn't directly answer your question but wouldn't the original query be better phrased without the case conditional as:
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
In which case, the LINQ expression should be easier?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With