2012-11-21 44 views
-1

我下面的EF模型:結果與總和時間跨度,羣組以及加入

enter image description here

我想在下面的視圖數據:

enter image description here

數據實體時間是毫秒的時間跨度。結果,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 = ???}; 
+1

請出示一些源代碼...你嘗試過什麼?什麼不工作? – Yahia

+0

因此,我嘗試編寫LINQ查詢,但我不明白如何從分組中獲取TimeSpan的SUM? – amaranth

回答

3

建議。你不應該在你的查詢中使用連接。您的模型具有導航屬性,請改用它們。你可以閱讀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)) 
      }); 
+0

我有錯誤:「First」方法只能用作最終查詢操作。請考慮在此實例中使用方法「FirstOrDefault」。 – amaranth

+0

使用FirstOrDefault我得到了:LINQ to Entities無法識別方法'System.TimeSpan Aggregate [Data,TimeSpan](System.Collections.Generic.IEnumerable'1 [test1.Data],System.TimeSpan,System.Func' 3 [System.TimeSpan,test1.Data,System.TimeSpan])'方法,並且此方法不能轉換爲存儲表達式。 – amaranth

+1

我的錯誤,我忘記了這是linq-to-entities,而不是linq-to-objects。簡單的解決方案將在中間層面上執行所有操作。只需寫ctx.Data.ToList()而不只是ctx.Data。我編輯了我的答案。 – HoberMellow

1

試試這個:

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

我有錯誤:操作符'+'不能應用於類型'int'和'System.TimeSpan'的操作數當然是 – amaranth

+0

。對不起,在我的建模代碼中它是int。我用sum.Add()更新答案 –