Метод OrderBy ожидает, что вы дадите ему лямбда-выражение (ну, на самом деле, делегат Func
, но большинство людей будут использовать лямбда-выражения для его создания), которое можно запустить, чтобы выбрать поле для сортировки. Кроме того, OrderBy всегда заказывает по возрастанию; если вам нужен нисходящий порядок, есть метод OrderByDescending
.
var query = books
.Include("Authors")
.OrderBy(book => book.Authors.Any()
? book.Authors.FirstOrDefault().Name
: string.Empty);
Это в основном говорит метод OrderBy: «для каждой книги в последовательности, если есть какие-либо авторы, выберите имя первой в качестве ключа сортировки; в противном случае выберите пустую строку. Затем верните мне книги, отсортированные по Ключ сортировки. "
Вы можете поместить все вместо string.Empty
, включая, например, book.Title
или любое другое свойство книги, чтобы использовать вместо фамилии для сортировки.
РЕДАКТИРОВАТЬ из комментариев:
Пока запрашиваемое поведение сортировки не слишком сложно, поставщик запросов Entity Framework обычно может выяснить, как превратить его в SQL. Он будет действительно очень стараться, и если это не удастся, вы получите ошибку запроса. Единственный раз, когда сортировка будет выполняться в объектах на стороне клиента, - это если вы принудительно выполняете запрос (например, .AsEnumerable()
) до вызова OrderBy
.
В этом случае EF выводит оператор выбора, который включает в себя следующее вычисляемое поле:
CASE WHEN ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[BookAuthor] AS [Extent4]
WHERE [Extent1].[Id] = [Extent4].[Books_Id]
)) THEN [Limit1].[Name] ELSE @p__linq__0 END AS [C1],
Тогда заказы по этому.
@p__linq__0
- это параметр, передаваемый как string.Empty
, так что вы можете видеть, что он довольно напрямую преобразует лямбда-выражение в SQL. Экстент и Лимит - это просто псевдонимы, используемые в сгенерированном SQL для объединенных таблиц и т. Д. Extent1
- это [Books]
, а Limit1
- это:
SELECT TOP (1) -- Field list goes here.
FROM [dbo].[BookAuthor] AS [Extent2]
INNER JOIN [dbo].[Authors] AS [Extent3] ON [Extent3].[Id] = [Extent2].[Authors_Id]
WHERE [Extent1].[Id] = [Extent2].[Books_Id]