2010-05-10 6 views
3

Это, скорее всего, новичок в вопросе LINQ, но при условии, что у меня есть набор элементов с свойством DateTime, причем одна дата имеет не более одного элемента, как бы я мог выбрать N самых последних элементов из дата ссылки, то есть N элементов, у которых дата меньше, чем запрашиваемая дата, и самая большая дата?
Моей наивной мыслью было бы сначала выбрать элементы с датой, меньшей, чем контрольная дата, сортировать по дате и выбрать N первых элементов из этого подмножества.выберите n наибольший, используя LINQ

var recentItems = from item in dataContext.Items 
       where item.Date<=date 
       orderby item.Date descending 
       select item; 

var mostRecentItems = recentItems.Take(5).ToList(); 

Действительно ли это «правильный» способ сделать это, или есть, очевидно, лучшие способы достижения моей цели?

ответ

5

Да, это правильный метод. Судя по слову dataContext, я предполагаю, что это код Linq to SQL; он превратится в эффективный запрос TOP N.

(Ну, «эффективный» до тех пор, пока данные индексируются по дате.)

Одна вещь, которую я мог бы изменить, чтобы удалить ToList(). Если вам действительно не нужен список , то обычно лучше оставить его как IEnumerable<T>, особенно если вам просто нужно перебрать его, а не получать элементы по индексу.

Редактировать: Я должен определить, что я имею в виду под номером лучше в отношении ToList. Когда вы вызываете ToList, вы получаете структуру в памяти, содержащую все элементов в наборе. Это использует память, которую вам не всегда нужно использовать. Для создания списка также требуется полная итерация всех записей, поэтому, если вы позже перейдете по самому списку, вы пройдете каждый элемент дважды.

Для всего 5 элементов разница, вероятно, не будет заметной; однако для 5000 элементов это может иметь большое значение. Поэтому вы должны привыкнуть не использовать ToList(), если не уверены, что вам это нужно. Большую часть времени вы этого не делаете.

+0

DataContext поступает из EF. И спасибо за полезные замечания по индексированию по датам и от использования ToList(). В этом конкретном случае мне нужен список, хотя причина не упоминается в описании проблемы! – Mathias

2

Я думаю, что это прекрасно. Вы также можете сделать это в 1-м предложении:

var recentItems = (from item in dataContext.Items 
       where item.Date<=date 
       orderby item.Date descending 
       select item).Take(5).ToList(); 

, но ваш путь в равной степени хорош.

3

Да, это точно, как это сделать.

Смежные вопросы