Почему оператор запроса 'ElementAt' не поддерживается в LINQ to SQL? - PullRequest
11 голосов
/ 01 марта 2011

В 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 ]

12 голосов
/ 01 марта 2011

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

  • TakeWhile, SkipWhile
  • Реверс
  • Last, LastOrDefault
  • ElementAt, ElementAtOrDefault
  • DefaultIfEmpty

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

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

Операторы

Обоснование

...

ElementAt , ElementAtOrDefault

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

9 голосов
/ 01 марта 2011

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

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

?

...