Условное выражение участвует в LINQ

Если Вы хотите, чтобы шепелявость была похожа на использование Ruby Ruby.

возможно использовать Ruby (и Python) в очень шепелявость как путь, который является одной из главных причин, они получили принятие так быстро.

5
задан Rex M 21 September 2009 в 05:51
поделиться

3 ответа

В вашем конкретном примере 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) , поэтому преобразователь выражений, кажется, понимает это.

5
ответ дан 14 December 2019 в 13:41
поделиться

Не дает прямого ответа на ваш вопрос, но не лучше ли сформулировать исходный запрос без условного регистра:

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 должно быть проще?

1
ответ дан 14 December 2019 в 13:41
поделиться

Некоторые сложные сценарии плохо отображаются в LINQ; Я бы предположил, что присоединение к делу является одним из них. Повторно выполняете это как перекрестное соединение ... вы его профилировали? (т.е. последующий SQL из из ... из ... (LINQ) против сложного соединения (TSQL)? Во многих случаях профилировщик может получить то же самое (или подобное) план запроса из старых подходов.

0
ответ дан 14 December 2019 в 13:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: