【问题标题】:LINQ query NotSupportedException OrderBy Average of TimeSpanLINQ 查询 NotSupportedException OrderBy 平均时间跨度
【发布时间】:2015-01-05 04:42:13
【问题描述】:
var seasonPlayer = (from SeasonPlayer in db.SeasonPlayerSet 
                    orderby SeasonPlayer.StatisticsPlayer.Average(x => x.STP_timeplay.Ticks) descending 
                    select SeasonPlayer).ToList();

SeasonPlayer 有一个 StatisticsPlayer 的 ICollection,所以我想获得在球场上花费的平均时间,按 STP_timeplay 降序排列,这是 TimeSpan 的一个典型值。我无法通过 STP_timeplay 获取平均值,因为它不是小数,所以我尝试通过 Ticks 获取平均值。它抛出一个异常:

The specified type member 'Ticks' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

【问题讨论】:

    标签: linq sql-order-by average timespan


    【解决方案1】:

    问题是 Linq to Entities 查询提供程序无法将您的 LINQ 转换为 Sql 查询,该查询连接到 Statistics Player,平均时间播放,按季节播放器分组。

    鉴于您似乎在迭代所有赛季球员,如果记录的数量不是太大,您可以像这样将这些全部记入内存:

    var seasonPlayer = db.SeasonPlayerSet
                          .Include(sp => sp.StatisticsPlayer)
                          .ToList()
                          .Select(sp => new {SeasonPlayer = sp, Average = sp.StatisticsPlayer.Average(stp => stp.STP_timeplay.Ticks)})
                          .OrderByDescending(sp => sp.Average)
                          .Select(sp => SeasonPlayer)
                          .ToList();
    

    【讨论】:

    • 我将Include(sp => sp.StatisticsPlayer) 更正为Include("StatisticsPlayer"),因为它返回了错误。而且我没有注意到某些 SeasonPlayer 还没有 StatisticsPlayer,所以它返回“序列不包含元素”,我添加了一个条件 Average = sp.StatisticsPlayer.Count() == 0 ? 0 : sp.StatisticsPlayer.Average(stp => stp.STP_timeplay.Ticks)。现在没事了。谢谢帮忙!
    • 很高兴能提供帮助。 strongly typed Include overload 更可取 - 您只需添加 using System.Data.Entity;。此外,Average 需要一些数据来处理的好消息。
    • 听从你的建议,我改回了Include(sp => sp.StatisticsPlayer)using System.Data.Entity;。现在它也可以工作了。谢谢这个提示!
    【解决方案2】:

    试试这个:-

    var seasonPlayer = db.SeasonPlayerSet.ToList()
                         .OrderByDescending(x => x.StatisticsPlayer
                                                 .Average(z => z.STP_timeplay.Ticks);
    

    【讨论】:

    • 在最后添加 .ToList() 以获取 SeasonPlayer 的 ICollection 时,我得到“序列不包含元素”。
    • @luki9696 - 您已将ToList() 添加到表或SeasonPlayer?请注意,该消息表示收集中没有数据。
    • 这是我的错。我尝试了给我 StuartLC 的解决方案,但我得到了同样的错误。我纠正了他的解决方案,现在我得到了正确的结果。我试图在您的解决方案中添加相同的条件,但我不知道如何正确添加它。很高兴也能看到你的想法。
    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2012-07-30
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多