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

В LINQ to SQL я получаю исключение « Оператор запроса 'ElementAt' не поддерживается. » При попытке использовать метод расширения ElementAt в IQueryable, возвращенном из LINQ в 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 не поддерживаются, есть ли где-нибудь список?

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

11
задан Joel Briggs 28 February 2011 в 21:26
поделиться