2013-07-30 4 views
2

Мне нужно вернуть последние 30 дней ежедневных назначений ежедневника и проверить, сделал ли пользователь по крайней мере 8 часов назначений на каждый день.Как сгруппировать по LINQ?

в SQL я могу сделать это с помощью этой команды:

select IDAppointment,IDUser, SUM(DurationInHours) from Note where AppointmentDate > *lastmonth and IDUser = @userID group by IDUser,IDAppointment,AppointmentDate 

и после этого я получить результат и проверить DurationInHours (двойной тип).

Возможно ли это с помощью LINQ? Получите список назначений пользователей в прошлом месяце и подтвердите их день ото дня

Спасибо!

+1

Да! что ты уже испробовал? –

+1

Возможный дубликат [Group by in LINQ] (http://stackoverflow.com/questions/7325278/group-by-in-linq) –

+1

@Brian У него есть несколько ключей. –

ответ

10

Это должно быть примерно там, хотя это не в моей голове, а не в IDE.

var result = context.Notes 
        .Where(n => [Your where clause]) 
        .GroupBy(n => new { n.IDUser, n.IDAppointment, n.AppointmentDate}) 
        .Select(g => new { 
            g.Key.IDAppointment, 
            g.Key.IDUser, 
            g.Sum(n => n.DurationInHours)}); 

UPDATE:

Для справки вашего, где положение будет что-то вроде этого ... (опять-таки с верхней части моей головы)

DateTime lastMonth = DateTime.Today.AddMonths(-1); 
int userId = 1 // TODO: FIX 
var result = context.Notes.Where(n => n.AppointmentDate > lastMonth 
            && n.IDUser = userId) 

Результирующее в ....

DateTime lastMonth = DateTime.Today.AddMonths(-1); 
int userId = 1 // TODO: FIX 
var result = context.Notes 
        .Where(n => n.AppointmentDate > lastMonth 
          && n.IDUser = userId) 
        .GroupBy(n => new { n.IDUser, n.IDAppointment, n.AppointmentDate}) 
        .Select(g => new { 
            g.Key.IDAppointment, 
            g.Key.IDUser, 
            g.Sum(n => n.DurationInHours)}); 
+0

Следует помнить, что ОП упоминает «30 дней», а не «1 месяц», который отличается, но это та же идея. –

+0

Это почти работает, но мой репозиторий по умолчанию возвращает список . И метод groupby изменяет его тип. Как я могу снова преобразовать «результат» в объект Note? – gog

+1

@ggui, если вы вернете его обратно в список заметок, вы потеряете группировку и сумму. Вы можете добавить примечания к анонимному результату, добавив «Примечания = g» после суммы. Это позволит вам выбирать записи, составляющие каждую группу. – NinjaNye

2

Это решение, которое я тестировал.

DateTime lastMonth = DateTime.Today.AddMonths(-1); 
int selectedUserId = 2; 

var notes = new List<Note>(
    new Note[] { 
     new Note() { 
      AppointmentDate = new DateTime(2013,7,30){}, 
      IDAppointment = 1, IDUser = 1, DurationInHours = 1 
     }, 
     new Note() { 
      AppointmentDate = new DateTime(2013,7,30){}, 
      IDAppointment = 1, IDUser = 1, DurationInHours = 2 
     }, 
     new Note() { 
      AppointmentDate = new DateTime(2013,7,30){}, 
      IDAppointment = 1, IDUser = 1, DurationInHours = 3 
     }, 
     new Note() { 
      AppointmentDate = new DateTime(2013,7,28){}, 
      IDAppointment = 2, IDUser = 2, DurationInHours = 2 
     }, 
     new Note() { 
      AppointmentDate = new DateTime(2013,7,28){}, 
      IDAppointment = 2, IDUser = 2, DurationInHours = 3 
     }, 
     new Note() { 
      AppointmentDate = new DateTime(2013,7,27){}, 
      IDAppointment = 2, IDUser = 2, DurationI nHours = 4 
     }, 
     new Note() { 
      AppointmentDate = new DateTime(2013,7,26){}, 
      IDAppointment = 3, IDUser = 3, DurationInHours = 3 
     }, 
     new Note() { 
      AppointmentDate = new DateTime(2013,7,25){}, 
      IDAppointment = 3, IDUser = 3, DurationInHours = 4 
     }, 
     new Note() { 
      AppointmentDate = new DateTime(2013,7,24){}, 
      IDAppointment = 3, IDUser = 3, DurationInHours = 5 
     } 
    } 
); 

var results = from n in notes 
       group n by new {n.IDUser, n.IDAppointment, n.AppointmentDate} 
       into g 
       where g.Key.AppointmentDate > lastMonth && 
        g.Key.IDUser == selectedUserId 
       select new { 
        g.Key.IDAppointment, 
        g.Key.IDUser, 
        TotalHours = g.Sum(n => n.DurationInHours) 
       }; 

Суммирование свойство необходимо присвоить имя явно (т.е. TotalHours), иначе вы получите ошибки CS0746: Invalid анонимный описатель члена типа. Члены анонимного типа должны быть объявлены с назначением членов, простым именем или доступом к члену.

+0

thats right matzoi, но я наклоняю фигуру, как использовать список, который возвращается, чтобы сделать проверку и отправить электронное письмо пользователю. Но спасибо – gog

+2

Если вы спрашиваете, как отнести результаты к элементам типа Примечание. Вам нужно только построить эти объекты соответствующим образом в предложении select. Как и ... Результаты вар = от п в примечаниях \t \t \t группа п новым {n.IDUser, n.IDAppointment, n.AppointmentDate} \t \t \t в г \t \t \t где g.Key.AppointmentDate> lastMonth && g.Key.IDUser == selectedUserId \t \t \t \t \t \t \t выберите новое примечание() {IDAppointment = g.Key.IDAppointment, IDUser = g.Key.IDUser, DurationInHours = g.Sum (п => п ,DurationInHours)}; ' – matzoi

Смежные вопросы