2014-02-16 27 views
0

我有一個LINQ實體框架查詢,返回是這樣的:實體劃分成組

{Start: 1/1/2000T18:00:00, FirstName: John, LastName: Doe}, 
{Start: 1/1/2000T18:00:00, FirstName: Bob, LastName: Doe}, 
{Start: 1/1/2000T18:00:00, FirstName: Jack, LastName: Doe}, 

{Start: 1/1/2000T22:00:00, FirstName: John, LastName: Doe}, 
{Start: 1/1/2000T22:00:00, FirstName: Bob, LastName: Doe}, 
{Start: 1/1/2000T22:00:00, FirstName: Jack, LastName: Doe}, 

{Start: 2/1/2000T10:00:00, FirstName: John, LastName: Doe}, 
{Start: 2/1/2000T10:00:00, FirstName: Bob, LastName: Doe}, 
{Start: 2/1/2000T10:00:00, FirstName: Jack, LastName: Doe}, 

{Start: 2/1/2000T14:00:00, FirstName: John, LastName: Doe}, 
{Start: 2/1/2000T14:00:00, FirstName: Bob, LastName: Doe}, 
{Start: 2/1/2000T14:00:00, FirstName: Jack, LastName: Doe}, 

e.g在不同的日子和不同時代的人的變化。

我想創造一個輪班分爲日期和時間,像這樣的對象:

1/1/2000: 
[ 
    18:00:00: 
    [ 
     {FirstName: John, LastName: Doe}, 
     {FirstName: Bob, LastName: Doe}, 
     {FirstName: Jack, LastName: Doe} 
    ] 
] 

等等

有沒有一種方便的方式來做到這一點與LINQ到實體?

謝謝!

+0

他們是datetime對象? –

+0

...對不起,DateTime對象 –

+0

是的,它們是DateTime對象 –

回答

3

您可以使用「group by」按多個屬性進行分組,但首先需要提取Start的日期和時間部分。你可以組首先按日期,然後按時間或語法簡單的方法是按兩者結合,然後組內採集的時候:

var x = from shift in Shifts 
        let date = EntityFunctions.TruncateTime(shift.Start) 
        let time = EntityFunctions.CreateTime(shift.Start.Hour, shift.Start.Minute, shift.Start.Second) 
        group shift by new { date, time } into groupedByDate 
        select new 
        { 
         Date = groupedByDate.Key.date, 
         ShiftsByTime = from g in groupedByDate group g by groupedByDate.Key.time 
        }; 

你也可以僅僅通過對{日期,時間組}如果你不關心層次結構:

var x = from shift in Shifts 
       let date = EntityFunctions.TruncateTime(shift.Start) 
       let time = EntityFunctions.CreateTime(shift.Start.Hour, shift.Start.Minute, shift.Start.Second) 
       group shift by new {date, time}; 

這是一個比上面第一個更詳細但語義上相同的查詢。我檢查生成的SQL和它或多或少相當於:

var x = from shift in Shifts 
       let date = EntityFunctions.TruncateTime(shift.Start) 
       group shift by date into groupedByDate 
       select new 
         { 
          Date = groupedByDate.Key, 
          ShiftsByTime = from g in groupedByDate 
           let time = EntityFunctions.CreateTime(g.Start.Hour, g.Start.Minute, g.Start.Second) 
           group g by time 
         }; 
0

嘗試使用。選擇和.GroupBy這樣的:

var res = list.Select(x => new 
         { 
          Person = x, 
          Date = x.Start.Date, 
          Time = x.Start.TimeOfDay 
         }) 
       .GroupBy(x => x.Date) 
       .Select(personGroupByDate => new 
       { 
        Date = personGroupByDate.Key, 
        Persons = personGroupByDate 
         .Select(x => x.Person) 
         .GroupBy(x => x.Time) 
         .Select(person => new 
         { 
          FirstName = person.FirstName, 
          LastName = person.LastName 
         }).ToList() 
       }).ToList() 
0

您需要使用的GroupBy築巢您的結果...

我發佈用於測試目的我的整個測試程序

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Web.Script.Serialization; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var objs = new Shift[] { 
       new Shift {Start= DateTime.Parse("1/1/2000 18:00:00"), FirstName= "John", LastName= "Doe"}, 
       new Shift {Start= DateTime.Parse("1/1/2000 18:00:00"), FirstName= "Bob", LastName= "Doe"}, 
       new Shift {Start= DateTime.Parse("1/1/2000 18:00:00"), FirstName= "Jack", LastName= "Doe"}, 
       new Shift {Start= DateTime.Parse("1/1/2000 22:00:00"), FirstName= "John", LastName= "Doe"}, 
       new Shift {Start= DateTime.Parse("1/1/2000 22:00:00"), FirstName= "Bob", LastName= "Doe"}, 
       new Shift {Start= DateTime.Parse("1/1/2000 22:00:00"), FirstName= "Jack", LastName= "Doe"}, 
       new Shift {Start= DateTime.Parse("2/1/2000 10:00:00"), FirstName= "John", LastName= "Doe"}, 
       new Shift {Start= DateTime.Parse("2/1/2000 10:00:00"), FirstName= "Bob", LastName= "Doe"}, 
       new Shift {Start= DateTime.Parse("2/1/2000 10:00:00"), FirstName= "Jack", LastName= "Doe"}, 
       new Shift {Start= DateTime.Parse("2/1/2000 14:00:00"), FirstName= "John", LastName= "Doe"}, 
       new Shift {Start= DateTime.Parse("2/1/2000 14:00:00"), FirstName= "Bob", LastName= "Doe"}, 
       new Shift {Start= DateTime.Parse("2/1/2000 14:00:00"), FirstName= "Jack", LastName= "Doe"} 
      }; 

      var dates = objs 
       .GroupBy(i => i.Start.Date) 
       .Select(i => new 
       { 
        Date = i.Key, 
        Times = i.GroupBy(s => s.Start.TimeOfDay).Select(s => new 
        { 
         Time = s.Key, 
         People = s.Select(ss => new { ss.FirstName, ss.LastName }) 
        }) 
       }); 

      Console.ReadLine(); 
     } 
    } 

    class Shift 
    { 
     public DateTime Start { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
    } 
}