使用 LINQ 在 selectman 子查询中进行聚合

Posted

技术标签:

【中文标题】使用 LINQ 在 selectman 子查询中进行聚合【英文标题】:Aggregation in selectmany subquery using LINQ 【发布时间】:2011-12-11 12:49:03 【问题描述】:

我正在我的 MVC 应用程序中实现一些基本的排名功能, 但是我在执行这个查询时遇到了一些奇怪的错误:

此查询的目的是找到最长的前 10 名骑手 总时间——即每个骑手完成的所有圈数的总和。

var topRiders = from rider in _riderDataProvider.GetAll()
                orderby
                    (from session in rider.Sessions
                     from lap in session.Laps
                     select lap.LapTime.TotalSeconds)
                     .Sum()
                descending
                select rider;
var result = topRiders.Take(10).ToArray();

但是,执行查询会抛出:

System.Data.SqlClient.SqlException:当子查询不带EXISTS时,选择列表中只能指定一个表达式。

坦率地说,我不知道这个异常意味着什么或如何解决它。 是否存在我遗漏的细微错误,或者我是否超出了 LINQ to SQL 的功能? (如果是这种情况,我可以用 SQL 重写查询,但不希望这样做。)

【问题讨论】:

这可能会有所帮助。 ***.com/questions/820552/… 【参考方案1】:

我会尝试这样的事情

var topRiders = from rider in _riderDataProvider.GetAll()
                select new 
                   Rider = rider,
                   TotalTime = (from session in rider.Sessions
                     from lap in session.Laps
                     select lap.LapTime.TotalSeconds)
                     .Sum(),
                

var result = topRiders.OrderByDescending(r=>r.TotalTime)
                      .Select(r=>r.Rider)
                      .Take(10).ToArray();

【讨论】:

以上是关于使用 LINQ 在 selectman 子查询中进行聚合的主要内容,如果未能解决你的问题,请参考以下文章

SQl子查询

Linq 到实体子查询

SQL中的子查询

linq依据传入数据集合查询相应子级数据

使用 LINQ to Entities 的内部查询(子查询)返回列表中的 IEnumerable 列表

跨复杂父/子/父/子关系的 LINQ 查询