2016-02-13 4 views
0

Я пытаюсь подсчитать, сколько сообщений отправлено в час. но мой код возвращает неверный результатLINQ Left Join, Group By and Count

Это оригинальный запрос sqlite, который я использовал, он работает правильно.

SELECT Hours.hour, ifnull(count(Messages.hour),0) as count Hours LEFT JOIN Messages on Messages.hour = Hours.hour by Hours.hour 

но я новый в LINQ, и вот мой код и запрос.

int[] Hours = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 }; 

var sortByHour = from h in Hours 
       join m in Messages on h equals m.Hour into g 
       orderby h ascending 
       select new 
       { 
        Hour = h, 
        Total = g.Count() 
       }; 

и возвращает

[0] { Hour = 0, Total = 33485 } 
[1] { Hour = 1, Total = 0 } 
[2] { Hour = 2, Total = 0 } 
[3] { Hour = 3, Total = 0 } 
... 
[23] { Hour = 23, Total = 0 } 

первые данные имеют ряд общих строк и других имеет 0. его неправильно.

результат должен быть как этот

[0] { Hour = 0, Total = 501 } 
[1] { Hour = 1, Total = 408 } 
[2] { Hour = 2, Total = 181 } 
[3] { Hour = 3, Total = 84 } 
... 
[23] { Hour = 23, Total = 1055 } 

как я могу исправить мой код? заранее спасибо.

ответ

1

Ответ

var res = from h in Hours 
      join m in Messages on h equals m.Hour into jn 
      from j in jn.DefaultIfEmpty() 
      select new 
      { 
       hour = h, 
       count = j != null ? jn.Count(i => i.Hour == h) : 0 
      } 

Но если у вас есть база данных, модель, соотношение между часами и сообщения, и мы говорим о LINQ к SQL или пуха к лицам, это лучше использовать (как USR упоминалось в комментариях) h.Messages.Count() и позволить движку базы данных сделать запрос

0

Нечто подобное должно решить вашу проблему.

Установка:

int[] Hours = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }; 
var Messages = new List<Message>() 
       { 
        new Message() { MessageId = 1, Hour = 5 }, 
        new Message() { MessageId = 2, Hour = 7 }, 
        new Message() { MessageId = 3, Hour = 5 }, 
        new Message() { MessageId = 4, Hour = 3 }, 
        new Message() { MessageId = 5, Hour = 7 }, 
        new Message() { MessageId = 6, Hour = 5 }, 
       }; 

Запрос:

var sortByHour = Hours.Select(h => 
    new { Hour = h, Total = Messages.Count(m => m.Hour == h) }); 

В принципе, вы просто выбираете каждый час и его количество в Messages.