【问题标题】:LINQ to Entities does not recognize the method ElementAt(i);LINQ to Entities 无法识别方法 ElementAt(i);
【发布时间】:2011-01-21 11:31:00
【问题描述】:

我正在使用方法elementat(Int32) 来获取查询结果的特定元素。

var mds = db.TDP_MissioniDestinazioni.Where(p => p.MissioneID == missioneRow.MissioneID);  

destinazioneRow = mds.ElementAt(i);

LINQ to Entities 无法识别该方法 'TimeEntModel.TDP_MissioniDestinazioni ElementAt[TDP_MissoniDestinazioni]
(System.Linq.IQueryable`1[TimeEntModel.TDP_MissoniDestinazioni], int32)' 方法,并且这个方法不能翻译成store 表达。

为什么会出现此错误,我该如何解决?

【问题讨论】:

    标签: c# linq entity-framework entity


    【解决方案1】:

    您是否乐于获取所有“较早”的结果?如果是这样,要么调用ToList() 来缓存它们,要么调用AsEnumerable() 在每次调用时获取它们,AsEnumerable 只是强制编译器调用Enumerable.ElementAt 而不是Queryable.ElementAt 的一种方式。

    不过可能有更好的方法(例如使用 Take 或 Skip) - 您能否提供更多关于大局的信息?

    【讨论】:

      【解决方案2】:

      您可以简单地将SkipFirst 混合使用即可:

      mds.Skip(i).First()
      

      【讨论】:

      • @Steven:知道与 mds.Skip(i - 1).First() 相比的翻译会是什么样子吗?
      • @Jon:希望 EF 会为此生成相同的 SQL 代码,但我有根据的猜测是您的 mds.Skip(i-1).First() 会生成更高效的 SQL。不错!
      • 我认为你必须使用.Skip(i) 而不是i-1,因为.ElementAt(i) 以0 开头。所以.ElementAt(0) 的等价物是.Skip(0).First()。不过,我迟到了将近三年。
      • @RodrigoWaltenberg:你完全正确。我更新了答案。
      • 请记住,Skip() 需要处理有序数据集,因此您可能需要在使用 Skip(i) 之前使用 OrderBy(e => e.Attribute)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 2012-04-03
      • 2021-11-06
      • 2012-05-03
      相关资源
      最近更新 更多