2013-02-14 2 views
6

У меня есть список дат. Я хотел бы запросить список и вернуть список пар, где первый элемент является датой, а второй - датой, которая происходит непосредственно перед первой датой (в списке).Вложенный запрос LINQ, чтобы выбрать «предыдущее» значение в списке

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

Я сделал это в SQL с помощью следующего запроса:

SELECT Date, 
    (SELECT MAX(Date) 
    FROM Table AS t2 
    WHERE t2.Date < t1.Date) AS PrevDate 
FROM Table AS t1 

ответ

5

Это легко, как преобразовать ваш текущий запрос в LINQ запроса:

var result = table.Select(x => 
    new 
    { 
     Date = x.Date, 
     PrevDate = table.Where(y => y.Date < x.Date) 
         .Select(y => y.Date) 
         .Max() 
    }); 
2
List<DateTime> dates = new List<DateTime>() 
{ 
    DateTime.Now.AddDays(1), 
    DateTime.Now.AddDays(7), 
    DateTime.Now.AddDays(3), 
    DateTime.Now.AddDays(6), 
    DateTime.Now.AddDays(5), 
    DateTime.Now.AddDays(2), 
    DateTime.Now.AddDays(3), 
}; 

dates = dates.OrderByDescending(x => x).ToList(); 
var result = dates.Skip(1) 
    .Select((x, i) => new { Date = dates[i], PreviousDate = x }); 
Смежные вопросы