Если Вы хотите, чтобы шепелявость была похожа на использование Ruby Ruby.
возможно использовать Ruby (и Python) в очень шепелявость как путь, который является одной из главных причин, они получили принятие так быстро.
В вашем конкретном примере CASE
используется для возврата к ненулевому значению, которое на самом деле является просто 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;
Что переводится в:
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]
Ключ - это левое внешнее соединение на COALESCE (case1, case2)
, поэтому преобразователь выражений, кажется, понимает это.
Не дает прямого ответа на ваш вопрос, но не лучше ли сформулировать исходный запрос без условного регистра:
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
В каком случае выражение LINQ должно быть проще?
Некоторые сложные сценарии плохо отображаются в LINQ; Я бы предположил, что присоединение к делу
является одним из них. Повторно выполняете это как перекрестное соединение ... вы его профилировали? (т.е. последующий SQL из из ... из ...
(LINQ) против сложного соединения
(TSQL)? Во многих случаях профилировщик может получить то же самое (или подобное) план запроса из старых подходов.