OrderBy для Nullable <int>со значением по умолчанию в Entity Framework - PullRequest
5 голосов
/ 27 октября 2011

Мы переносим некоторый код для использования Entity Framework и имеем запрос, который пытается отсортировать по полю Nullable и предоставляет значение сортировки по умолчанию, если значение равно нулю, используя Nullable.GetValueOrDefault (T) функция.

Однако при выполнении возвращается следующая ошибка:

LINQ to Entities не распознает метод метода Int32 GetValueOrDefault (Int32), и этот метод нельзя преобразовать в выражение хранилища.

Запрос выглядит так:

int magicDefaultSortValue = 250;
var query = context.MyTable.OrderBy(t => t.MyNullableSortColumn
                                          .GetValueOrDefault(magicDefaultSortValue));

Из этого ответа я вижу, что в EDMX есть способ предоставить "переводы". Можем ли мы написать аналогичный перевод для этой функции объединения?

ПРИМЕЧАНИЕ: Когда я пытался, оператор объединения ?? вместо GetValueOrDefault в запросе, который он работает. Так что, возможно, все, что делает эту работу, можно использовать?

1 Ответ

12 голосов
/ 27 октября 2011

Полагаю, вы нашли свой ответ. Когда вы используете ??, 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 , поскольку они предоставляют доступ к нескольким полезным функциям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...