为什么LINQ to SQL不支持查询运算符'ElementAt'?

Joe*_*ggs 11 c# extension-methods linq-to-sql

在LINQ to SQL中,我得到异常" 不支持查询运算符'ElementAt'. "当尝试在从LINQ to SQL查询返回的IQueryable上使用ElementAt扩展方法时.

这是堆栈跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

现在我意识到要摆脱这个异常并使用ElementAt我可以在使用扩展方法之前调用'.ToList()'它会起作用.这很好,但我仍然不喜欢这是一个运行时异常(看起来像LSP违规)的事实.

有没有理由不支持这些方法?是不是因为它们无法轻易翻译成SQL?不支持哪些其他IQueryable/IEnumerable扩展方法,是否有某个列表?

避免运行时异常会很好.

Bro*_*ass 12

从MSDN,标准查询运算符转换(LINQ to SQL) - 本文包含尚未翻译的运算符的完整列表:

  • TakeWhile,SkipWhile
  • 相反
  • 最后,LastOrDefault
  • ElementAt,ElementAtOrDefault
  • DefaultIfEmpty

没有翻译的运营商

LINQ to SQL不会将以下方法转换.最常见的原因是无序多重集和序列之间的差异.

运营商

合理

...

ElementAt,ElementAtOrDefault

SQL查询在多个集合上运行,而不是在可索引序列上运行.


Mar*_*ell 9

这很奇怪,特别是因为Skip()得到了支持.例如,你能做到:

var obj = source.Skip(index).First();
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,我必须在跳过之前使用 OrderBy() (2认同)