Entity Framework - комбинированная сортировка по 2 колонкам - PullRequest
1 голос
/ 15 ноября 2011

У меня есть запрос, в котором я получаю множество названий назад и упорядочиваю их по дате выпуска:

        model.NewCollections = db.Collections
                               .Where(p => p.ReleaseDate < DateTime.Now)
                               .OrderByDescending(o => o.ReleaseDate)
                               .Take(5);

Теперь я добавил еще один столбец в свою базу данных, чтобы у меня была книга в мягкой обложке.дата выпуска и дата выпуска в твердом переплете (при этом используется исходная дата выпуска).

Я хочу запрос, который доставит мне все твердые и мягкие обложки с датой выпуска после сегодняшнего дня, которую, я полагаю, я могу сделать какthis:

        model.NewCollections = db.Collections
                               .Where(p => p.ReleaseDate < DateTime.Now || p.PBReleaseDate < DateTime.Now)
                               .OrderByDescending(o => o.ReleaseDate)
                               .Take(5); 

Но как мне упорядочить их так, чтобы они возвращались справа в порядке убывания даты?

, т. е. если запрос вернул следующий список (воображаемая сегодняшняя дата14 ноября):

Title 1:    HB: 13/11/11    PB: 31/12/11
Title 2:    HB: 31/12/11    PB: 31/12/11
Title 3:    HB: 11/11/11    PB: 31/12/11
Title 4:    HB: 31/12/11    PB: 31/12/11
Title 5:    HB: 31/12/11    PB: 10/11/11
Title 6:    HB: 31/12/11    PB: 12/11/11
Title 7:    HB: 31/12/11    PB: 31/12/11
Title 8:    HB: 31/12/11    PB: 31/12/11
Title 9:    HB: 31/12/11    PB: 31/12/11
Title 10:   HB: 31/12/11    PB: 09/11/11 

Возвращается со следующим порядком названий: 1, 6, 3, 5, 10

Заранее спасибо

1 Ответ

1 голос
/ 15 ноября 2011

Вам нужно выбрать во временный объект, где вы рассчитываете данные комбинированного выпуска:

model.NewCollections = db.Collections
    .Where(p => p.ReleaseDate < DateTime.Now || p.PBReleaseDate < DateTime.Now)
    .Select(c => new { c.Title, Date = c.PBReleaseDate < c.ReleaseDate ? c.PBReleaseDate : c.ReleaseDate })
    .OrderByDescending(c => c.Date)
    .Take(5).ToList(); 

Из этого запроса LINQ EF сгенерирует следующий запрос SQL с соответствующей инструкцией CASE:

SELECT TOP (5) 
[Project1].[C1] AS [C1], 
[Project1].[Title] AS [Title], 
[Project1].[C2] AS [C2]
FROM ( SELECT 
    [Extent1].[Title] AS [Title], 
    1 AS [C1], 
    CASE WHEN ([Extent1].[PBReleaseDate] < [Extent1].[ReleaseDate]) THEN [Extent1].[PBReleaseDate] ELSE [Extent1].[ReleaseDate] END AS [C2]
    FROM [dbo].[Collections] AS [Extent1]
    WHERE ([Extent1].[ReleaseDate] < (SysDateTime())) OR ([Extent1].[PBReleaseDate] < (SysDateTime()))
)  AS [Project1]
ORDER BY [Project1].[C2] DESC

То, что по вашим данным испытаний дает ожидаемый результат:

[0]: { Title = "1", Date = {11/13/2011 12:00:00 AM} }
[1]: { Title = "6", Date = {11/12/2011 12:00:00 AM} }
[2]: { Title = "3", Date = {11/11/2011 12:00:00 AM} }
[3]: { Title = "5", Date = {11/10/2011 12:00:00 AM} }
[4]: { Title = "10", Date = {11/9/2011 12:00:00 AM} }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...