Как написать linq, чтобы получить самые последние входящие записи о событиях - PullRequest
1 голос
/ 22 января 2011

var events = context.Events .........

События имеют свойство 'DueDate' (Datetime)

Я хочу выбрать 5 последних записей, как написать такой запрос? Спасибо

Ответы [ 2 ]

3 голосов
/ 22 января 2011

Если вас интересуют события, которые находятся ближе всего к дню, вы можете сделать это:

DateTime today = DateTime.Now;
var events = context.Events
                    .OrderBy(e => Math.Abs((today - e.DueDate).Days))
                    .Take(5)
                    .ToList();

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

Если вы хотите, чтобы события, которые были самыми последними, но только в будущем, вы могли бы сделать:

DateTime today = DateTime.Now;
var events = context.Events
                    .Where(e => e.DueDate >= today)
                    .OrderBy(e => (e.DueDate - today).Days)
                    .Take(5)
                    .ToList();

Редактировать:

Если выиспользовать LINQ to Entities DateTime манипуляции не поддерживаются напрямую, но если вы используете SQL-сервер, то что-то вроде DateDiff должно работать (не проверено, вы должны попробовать сами):

DateTime today = DateTime.Now;
var events = context.Events
                    .Where(e => e.DueDate >= today)
                    .OrderBy(e => System.Data.Objects.SqlClient.SqlFunctions.DateDiff("d", e.DueDate, today))
                    .Take(5)
                    .ToList();

Если это не сработает, вы всегда можете сначала получить свои данные, а затем отфильтровать с помощью LINQ объектов, что дает дополнительные преимущества, заключающиеся в том, что вы не привязываете себя к SQL Server, но, очевидно, это не очень эффективно:

DateTime today = DateTime.Now;
var futureEvents = context.Events
                          .Where(e => e.DueDate >= today);
                          .ToList();   

var filteredEvent = futureEvents 
                    .OrderBy(e => (e.DueDate - today).Days)
                    .Take(5)
                    .ToList();
1 голос
/ 22 января 2011

Один способ написать это:

var events = context.Events.OrderByDescending(e=>e.DueDate).Take(5);

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