2010-06-23 116 views
4

是否可以通过使用延迟可执行的LINQ-to-SQL查询表达式或方法链来生成以下SQL查询?如何在LINQ-to-SQL中生成SQL COUNT(*)OVER(PARTITION BY {ColumnName})?

数据结构

alt text 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 

预期结果

alt text http://www.freeimagehosting.net/uploads/47a79fea8b.jpg

+0

CN你所得到的数据的波斯坦例子吗? – Luiscencio 2010-06-23 21:44:33

+0

我刚编辑以包含预期结果。 – 2010-06-24 01:50:19

+0

只是编辑我的答案,以适应您的预期结果 – Luiscencio 2010-06-24 14:24:59

回答

1

试试这个:

 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); 
1
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 
    });