gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:37:55 25 4
gpt4 key购买 nike

在 LINQ to SQL 中,尝试对从 LINQ to SQL 查询返回的 IQueryable 使用 ElementAt 扩展方法时,出现异常“不支持查询运算符‘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 扩展方法,是否有列表?

最好避免运行时异常。

最佳答案

来自 MSDN,Standard Query Operator Translation (LINQ to SQL) - 本文包含尚未翻译的运算符的完整列表:

  • TakeWhile , SkipWhile
  • 反转
  • 上一个,上一个或默认
  • ElementAt , ElementAtOrDefault
  • DefaultIfEmpty

Operators with No Translation

The following methods are nottranslated by LINQ to SQL. The mostcommon reason is the differencebetween unordered multisets andsequences.

Operators

Rationale

...

ElementAt ,ElementAtOrDefault

SQL queries operate on multisets, noton indexable sequences.

关于c# - 为什么 LINQ to SQL 不支持查询运算符 'ElementAt'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5147767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com