Ответ 1
Вы можете попробовать следующее:
var query=data.Skip(1).Take(1);
У меня есть таблица обменных курсов. Мне нужно получить текущий курс и предыдущий курс, а затем сравнить результаты.
Я могу получить первую запись, используя FirstOrDefault
.
Когда я использую ElementAtOrDefault
, эта ошибка показывает "Оператор запроса" ElementAtOrDefault "не поддерживается". Как я могу получить вторую запись?
Вы можете попробовать следующее:
var query=data.Skip(1).Take(1);
Take() возвращает null, если элемент не существует (так что это эквивалентно FirstOrDefault()).
Если вы предпочли бы исключение (потому что второго элемента там нет), например First(), используйте:
Skip(1).Single()
Здесь подробно не указано здесь: FirstOrDefault
возвращает Element
, Skip(1).Take(1)
возвращает набор из 1 элемента; то есть тип, возвращаемый Skip(1).Take(1)
, равен IEnumerable
, а FirstOrDefault
- нет.
Если вы используете
.Take(2)
вы получите первый и второй.
РЕДАКТИРОВАТЬ. Если вам нужны как первые, так и другие, то приведенное выше будет более эффективным, чем выполнение запроса дважды:
.Take(1)
.Skip(1).Take(1)
Попробуйте эту простую реализацию, это может быть полезно
var query= (from p in db.Person where p.Person == person_id select p);
var firstResult = query.First();
var secondResult = query.Skip(1).Take(1).Single();
var thirdResult = query.Skip(2).Take(1).Single();
Выберите верхнюю часть 2, затем выберите второй элемент.
Collection.ElementAt(1)
отобразит вторую запись в коллекции.
Использовать метод .Skip(1)
Как уже отмечал Джон Андерсон, Skip(1).Take(1)
возвращает IEnumerable
размера 1.
Для того, чтобы получить саму запись или иначе null
(то есть без исключений), я использую следующее:
var secondEntry = collection?.Skip(1)?.FirstOrDefault();
Это может не работать в вашем конкретном случае, но может быть полезно для других случаев использования.