在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)
现在我意识到要摆脱这个异常并使用ElementAt我可以在使用扩展方法之前调用'.ToList()'它会起作用。这很好,但我仍然不喜欢这是一个运行时异常(看起来像LSP违规)这一事实。
是否有理由不支持这些方法?是不是因为它们无法轻易翻译成SQL?不支持哪些其他IQueryable / IEnumerable扩展方法,是否有某个列表?
避免运行时异常会很好。
答案 0 :(得分:12)
来自MSDN,Standard Query Operator Translation (LINQ to SQL) - 本文包含尚未翻译的运营商的完整列表:
没有翻译的运营商
以下方法不是 由LINQ翻译成SQL。最多 常见的原因是差异 在无序的多重集合之间 序列。
运营商
原理
...
ElementAt , ElementAtOrDefault
SQL查询在多个集合上运行,而不是 关于可索引序列。
答案 1 :(得分:9)
这很奇怪,特别是因为支持Skip()
。例如,你能做到:
var obj = source.Skip(index).First();