C# 来自LINQ的结果,包括TimeSpan、GROUP和JOIN的总和

C# 来自LINQ的结果,包括TimeSpan、GROUP和JOIN的总和,c#,linq,entity-framework,group-by,sum,C#,Linq,Entity Framework,Group By,Sum,我有以下EF模型: 我想在以下视图中获取数据: 在数据实体中,时间是以毫秒为单位的时间跨度。结果,PlaceInStep是通过StepId在成员之间放置的 如何提出这一难题 编辑1: 我的一些代码: var query = from data in ctx.Data join member in ctx.Members on data.MemberId equals member.

我有以下EF模型:

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

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

如何提出这一难题

编辑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 = ???};

首先是建议。您不应该在查询中使用join。如果您的模型具有导航属性,请改用它们。你可以读到克雷格·斯特恩茨的文章

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

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))
            });
试试这个:

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))
                           });

请显示一些源代码。。。你试过什么?什么不起作用?因此,我尝试编写LINQ查询,但我不知道如何从分组中获取TimeSpan的总和?我遇到了错误:“First”方法只能用作最终查询操作。考虑在该实例中使用方法“FrestSturrute'”。使用FrimSturtRebug,我得到:LINQ to实体不识别方法“System TimeSpApple聚合[数据,TimeSIP] ](System .Cuff.Gual.InEdaby <代码> 1 [ Test1.DATA ],System.TimeSpan,System .Func</Case> 3 [ System TimeS盘,Test1,DATA,System .TimeSpAN] ]方法,这个方法不能转换成存储表达式。我的错误是,我忘记了什么是linq到实体,而不是linq到对象。简单的解决方案是在中间层端执行所有操作。只需编写ctx.Data.ToList(),而不仅仅是ctx.Data。我已经编辑了我的答案。是的,这很有帮助。非常感谢。那么在查询中的tema成员的数量呢?好的。我又改变了答案。我希望这是最终答案)我有一个错误:运算符“+”当然不能应用于“int”和“System.TimeSpan”类型的操作数。对不起,在我的建模代码中是int。我用sum.Add()更新了答案