Полагаю, вы нашли свой ответ. Когда вы используете ??
, EF генерирует SQL с помощью CASE
для выбора значения сортировки, если оно равно null
, а затем сортирует по нему.
MyTable.OrderBy (t => t.MyNullableSortColumn ?? magicDefaultSortValue).ToArray();
сгенерирует следующий sql:
-- Region Parameters
DECLARE p__linq__0 Int = 250
-- EndRegion
SELECT
[Project1].[MyColumn1] AS [MyColumn1],
[Project1].[MyNullableSortColumn] AS [MyNullableSortColumn]
FROM ( SELECT
CASE WHEN ([Extent1].[MyNullableSortColumn] IS NULL) THEN @p__linq__0 ELSE [Extent1].[MyNullableSortColumn] END AS [C1],
[Extent1].[MyColumn1] AS [MyColumn1],
[Extent1].[MyNullableSortColumn] AS [MyNullableSortColumn]
FROM [dbo].[MyTable] AS [Extent1]
) AS [Project1]
ORDER BY [Project1].[C1] ASC
Кроме того, я бы порекомендовал получить LINQPad , который позволит вам работать с вашими EF-моделями и просматривать создаваемый sql. Также полезно знать о классе EntityFunctions и о классе SqlFunctions , поскольку они предоставляют доступ к нескольким полезным функциям.