Как создать SQL COUNT (*) OVER (PARTITION BY {ColumnName}) в LINQ-to-SQL? - PullRequest
4 голосов
/ 23 июня 2010

Можно ли сгенерировать следующий SQL-запрос с помощью выражения запроса LINQ-to-SQL или цепочек методов, которые могут быть отложены?

Структура данных

альтернативный текст http://www.freeimagehosting.net/uploads/e062a48837.jpg

   Select Distinct ClassRoomTitle, 
                Count(*) Over(Partition By ClassRoomNo) As [No Sessions Per Room], 
                TeacherName, 
                Count(*) Over(Partition By ClassRoomNo, TeacherName) As [No Sessions Per Teacher] From ClassRoom

Ожидаемый результат

альтернативный текст http://www.freeimagehosting.net/uploads/47a79fea8b.jpg

Ответы [ 2 ]

1 голос
/ 09 сентября 2010
var classRooms = from c in context.ClassRooms
                 group c by new {c.ClassRoomNo} into room
                 select new {
                    Title = room.First().ClassRoomTitle,
                    NoSessions = room.Count(),
                    Teachers = from cr in room
                               group cr by new {cr.TeacherName} into t
                               select new {
                                   Teacher = t.Key,
                                   NoSessions = t.Count()
                               }
                 };

Немного более структурировано, чем опубликованный ожидаемый результат, но я считаю, что это лучше.

Вы всегда можете использовать SelectMany, если хотите вернуться к неструктурированным:

var unstructured = classRooms
   .SelectMany(c=> c.Teachers.Select( t=> new {
      Title = c.Title,
      SessionsPerRoom = c.NoSessions,
      Teacher = t.Teacher,
      SessionsPerTeacher = t.NoSessions
   });
1 голос
/ 02 июля 2010

Попробуйте:

        var vGroup = from p in ClassRoom
                     group p by new { p.ClassRoomNo, p.TeacherName }
                         into g
                         from i in g
                         select new
                         {
                             i.ClassRoomNo,
                             i.TeacherName,
                             i.ClassRoomTitle,
                             NoSessionsPerTeacher = g.Count()
                         };

        var pGroup = from p in vGroup
                     group p by new { p.ClassRoomNo }
                         into g
                         from i in g
                         select new
                         {
                             i.ClassRoomTitle,
                             NoSessionsPerRoom = g.Count(),
                             i.TeacherName,
                             i.NoSessionsPerTeacher
                         };

        var result = pGroup.OrderBy(p => p.ClassRoomNo).ThenBy(p => p.TeacherName);

Я не проверял вышеизложенное, но вы можете проверить мой оригинальный код на случай, если что-то не так в перезаписи:

        var vGroup = from p in Products
                     group p by new { p.ProductId, p.VariantId }
                         into g
                         from i in g
                         select new
                         {
                             i.ProductId,
                             i.VariantId,
                             VariantCount = g.Count()
                         };

        var pGroup = from p in vGroup
                     group p by new { p.ProductId }
                         into g
                         from i in g
                         select new
                         {
                             i.ProductId,
                             ProductCount = g.Count(),
                             i.VariantId,
                             i.VariantCount
                         };

        var result = pGroup.OrderBy(p => p.ProductId).ThenBy(p => p.VariantId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...