【问题标题】:LINQ aggregate queryLINQ 聚合查询
【发布时间】:2014-11-26 00:04:46
【问题描述】:

我正在尝试通过 via 显示来自数据库的结果,其中包含来自同一表的聚合值。 我有一个包含名称、分数和回合的表格,其中包含每个特定回合的球员姓名和分数。我想在网格中显示它(比如我选择第 5 轮),但我还想显示每个玩家的排名,这是他们在所有回合中的总得分,包括所选回合。

到目前为止,我有两个查询 - 一个返回名称列表和他们的回合得分总和,另一个返回他们的名字,特定回合的得分。 我只需要总和的索引来获得排名,我不需要分数本身的总和。 我正在尝试将第一个查询包含在第二个查询中,例如

Rank = r1.FindIndex(r => r.Name == tr.Name)

但我不断收到错误消息 'LINQ to Entities 无法识别方法'Int32 FindIndex'。 我知道我为什么会得到这个(它不能编译成 SQL),但我不知道如何解决它。 那么,我如何构建我的查询,以便它从表中获取我需要的行,同时还要考虑正确的排名,即第一个查询中玩家的索引? 有什么建议吗?

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    如果您希望查询在内存中运行,请使用IEnumerable 表单而不是IQueryable 表单。用 Linq 干净地做到这一点的方法是 .AsEnumerable()

    Rank = r1.AsEnumerable().FindIndex(r => r.Name == tr.Name);
    

    请注意,仅当编译时类型为IQueryable 时,才需要调用AsEnumerable()。由于我们讨论的是扩展方法,它们将根据运行时已知的类型正确调用 - 所有IEnumerable 方法都使用foreachyield return 模式,这会将SQL 查询迭代到内存中

    【讨论】:

    【解决方案2】:

    感谢 Aravol 和 Flaudre。最后,简单地更改了 db 端的数据结构,以通过视图保存我需要的信息。实现起来比试图找出这些 LINQ 错误要简单得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 2019-02-04
      相关资源
      最近更新 更多