2014-02-16 28 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; } 
    } 
}