【问题标题】:Results from LINQ with SUM for TimeSpan, GROUP and JOIN [closed]LINQ 与 TimeSpan、GROUP 和 JOIN 的 SUM 结果[关闭]
【发布时间】:2012-11-21 09:28:35
【问题描述】:

我关注的是 EF 模型:

我想在以下视图中获取数据:

在数据实体中时间是以毫秒为单位的时间跨度。结果,PlaceInStepStepId 放置在成员之间。

如何进行这个硬查询?

编辑 1

我的一些代码:

var query = from data in ctx.Data
                            join member in ctx.Members
                            on data.MemberId equals member.MemberId
                            join team in ctx.Teams
                            on member.TeamId equals team.TeamId
                            group member by member.TeamId into g
                            select new {TeamId = g.Key, TeamName = g.Select(t=>t.Teams.TeamName), TotalTime = ???};

【问题讨论】:

  • 请展示一些源代码...你试过什么?什么不工作?
  • 所以,我尝试编写 LINQ 查询,但我不明白如何从分组中获取 TimeSpan 的 SUM?

标签: c# linq entity-framework group-by sum


【解决方案1】:

最初的建议。您不应该在查询中使用 join。您的模型具有导航属性,请改用它们。你可以阅读 Craig Stuntz 的 blogpost 来了解它。

您可以在内部列表中选择所有团队和有关成员的信息。试试这个:

var query = ctx.data.ToList().OrderBy(d => d.Time).
            GroupBy(d => d.Members.StepId).
            SelectMany(g => g.Select((d, place) => new { Time = d.Time, Members = d.Members, PlaceInStep = place + 1 })).
            GroupBy(d => d.Members.TeamId).
            Select(g => new 
            {
               TeamId = g.Key, 
               Name = g.Select(d => d.Members.Teams.TeamName).First(),  
               Members = g.Select(d => new {Time = d.Time, PlaceInStep = d.PlaceInStep, MemberName = d.Members.MemberName}),                    
               TotalTime = g.Aggregate(new TimeSpan(), (sum, nextData) => sum.Add(nextData.Time))
            });

【讨论】:

  • 我遇到错误:方法“First”只能用作最终查询操作。请考虑在此实例中使用“FirstOrDefault”方法。
  • 使用 FirstOrDefault 我得到:LINQ to Entities 无法识别方法 'System.TimeSpan Aggregate[Data,TimeSpan](System.Collections.Generic.IEnumerable1[test1.Data], System.TimeSpan, System.Func3[System.TimeSpan, test1.Data,System.TimeSpan])' 方法,并且该方法不能翻译成存储表达式。
  • 我的错,我忘记了这是什么 linq-to-entities,而不是 linq-to-objects。简单的解决方案将在中间层执行所有操作。只需编写 ctx.Data.ToList() 而不仅仅是 ctx.Data。我已经编辑了我的答案。
  • 是的,这很有帮助。谢谢!!!那么查询中的 tema 成员呢?
  • 好的。我又改了答案。我希望这是最终答案)
【解决方案2】:

试试这个:

var query = ctx.Data.Join(ctx.Members, d => d.MemberId, m => m.MemberId, (d,m)=>new {data=d, member = m})
                .Join(ctx.Teams, dm=>dm.member.TeamId, t=>t.TeamId, (dm, t)=>new{data=dm.data, member=dm.member, team = t})
                .GroupBy(dmt=>new {dmt.team.TeamId, dmt.team.TeamName})
                .Select(g=>new 
                           {
                               TeamId = g.Key.TeamId, 
                               TeamName = g.Key.TeamName, 
                               TotalTime = g.Aggregate(0, (sum, gr)=>sum.Add(gr.data.Time))
                           });

【讨论】:

  • 我遇到错误:运算符“+”不能应用于“int”和“System.TimeSpan”类型的操作数
  • 当然。抱歉,在我的建模代码中它是 int。我用 sum.Add() 更新答案
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
相关资源
最近更新 更多