Сбой, потому что метод ElementAt
является методом индексированного доступа, а Entity Framework не знает, как превратить его в SQL.
Когда вы используете метод First
, Entity Framework может преобразовать это в предложение TOP 1
в запросе SQL. Это очень очень просто. Чтобы использовать ElementAt
, он должен был бы построить гораздо более сложный запрос, основанный на оконных функциях (ROW_NUMBER()
), и, ну, он просто не достаточно сложен, чтобы сделать это.
Это на самом деле задокументированное ограничение Entity Framework. Расширение ElementAt
просто не поддерживается.
Теоретически вы могли бы написать это вместо:
se = students.AsEnumerable().ElementAt<StudentEntity>(0);
Это дает указание Entity Framework не пытаться «переводить» что-либо после вызова AsEnumerable()
, поэтому вместо этого он извлекает всех результатов (не только первых) и выполняет итерацию по ним до он попадает к элементу, который вы хотите (который в данном случае просто бывает первым).
Однако это замедлит работу на по сравнению с использованием First()
, потому что вместо того, чтобы просто получать 1 результат с сервера, он выбирает их все и фильтрует впоследствии. Я бы использовал этот обходной путь, только если по какой-то странной причине мне нужно было получить 5-й или 10-й элемент или какой-то элемент , отличный , чем первый.