С учетом даты, что является наиболее эффективным способом запроса последней записи до этой даты, любой записи, которая равна этой дате, и следующей после этой даты.В Linq2SQL, как мне получить запись плюс предыдущую и следующую последовательность в одном запросе?
Он должен быть функционально эквивалентен запросу, как это:
from asset in Assets
where asset.Id == assetId
select new {
Previous = (from a in a.Orders where a.Date < myDate orderby a.Date descending select a).FirstOrDefault(),
Current = (from a in a.Orders where a.Date == myDate select a).SingleOrDefault(),
Next = (from a in a.Orders where a.Date > myDate orderby a.Date select a).FirstOrDefault()
}
Как есть, этот запрос выполняется три запроса, и, вероятно, имеет для сортировки набора данных по MyDate три раза, чтобы сделать это.
Некоторые подобные вопросы:
- How do I get 5 records before AND after a record with a specific ID? (только использует два запроса)
- How do I get records before and after given one? Не в Linq, и поэтому трудно для меня, чтобы воспользоваться (моя команда будет раздражать).
Полезный ответ, в зависимости от размера возврата. Тем не менее, я думаю, что это может быть улучшено с помощью контейнера, который знает, что он отсортирован, поэтому поисковые запросы O (log n) вместо O (n), как они есть в вашем примере. –
@Scott - Да, его можно улучшить. Я сделал тест с 100 000 записей заказов - по одной записи за каждый день с сегодняшнего дня, вернувшейся в апреле 1737 года, - это не вполне реальный пример. Прошло около 7,2 миллисекунды, чтобы запустить, используя метод, указанный в моем ответе. Я также создал метод индекса бисекции, и это заняло около 0,7 миллисекунды. Используя 'Array.FindIndex', оно заняло 0.83 миллисекунды. Оба этих последних двух подхода к коду были менее читабельными. С практической точки зрения, будет ли эта разница в производительности важна для вас? – Enigmativity
Наверное, нет. ;) Спасибо за бенчмаркинг! –