Почему оператор запроса "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 не поддерживаются, есть ли где-нибудь список?

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

2 ответов


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

  • TakeWhile , SkipWhile
  • реверс
  • Последние , Метода Lastordefault
  • ElementAt , ElementAtOrDefault
  • DefaultIfEmpty

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

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

операторы

обоснование

...

ElementAt , ElementAtOrDefault

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


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

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

?