Подтвердить что ты не робот

Почему оператор запроса ElementAt не поддерживается в LINQ to SQL?

В LINQ to SQL я получаю исключение "Оператор запроса" ElementAt "не поддерживается". При попытке использовать метод расширения ElementAt для IQueryable, возвращаемого из запроса LINQ to SQL.

Вот трассировка стека:

at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
   at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)
   at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
   at System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node)
   at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.Table`1.System.Linq.IQueryProvider.Execute[TResult](Expression expression)
   at System.Linq.Queryable.ElementAt[TSource](IQueryable`1 source, Int32 index)

Теперь я понимаю, чтобы избавиться от этого исключения и использовать ElementAt, чтобы использовать метод ".ToList()" перед использованием метода расширения, и он будет работать. Это нормально, но мне все еще не нравится тот факт, что это исключение во время выполнения (и то, что похоже на нарушение LSP).

Есть ли причина, по которой эти методы не могут быть поддержаны? Это просто потому, что они не могут быть легко переведены в SQL? Какие другие методы расширения IQueryable/IEnumerable не поддерживаются, есть ли где-нибудь список?

Было бы неплохо избежать исключений во время выполнения.

4b9b3361

Ответ 1

От MSDN, Перевод операторов стандартных запросов (LINQ to SQL) - эта статья содержит полный список операторов, которые еще не были переведены:

  • TakeWhile, SkipWhile
  • Reverse
  • Last, LastOrDefault
  • ElementAt, ElementAtOrDefault
  • DefaultIfEmpty

Операторы без перевода

Следующие методы не являются переведены LINQ на SQL. Большинство общей причиной является различие между неупорядоченными мультимножествами и последовательности.

Операторы

Обоснование

...

ElementAt, ElementAtOrDefault

SQL-запросы работают на мультимножествах, а не на на индексируемых последовательностях.

Ответ 2

Это нечетно, в частности, потому что поддерживается Skip(). Могли бы вы, например, сделать:

var obj = source.Skip(index).First();

?