c# - 如何在 LINQ-to-SQL 中生成 SQL COUNT(*) OVER (PARTITION BY {Column Name})?

标签 c# linq linq-to-sql .net-3.5

是否可以使用可延迟执行的 LINQ-to-SQL 查询表达式或方法链来生成以下 SQL 查询?

数据结构

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

最佳答案

试试这个:

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

关于c# - 如何在 LINQ-to-SQL 中生成 SQL COUNT(*) OVER (PARTITION BY {Column Name})?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3100530/

相关文章:

c# - 使用 LEFT JOIN 到 LINQ 表达式语法的多个连接语句

c# - Entity Framework Core 和带有存储过程的列级 SQL Server 加密,如何以正确的方式映射属性?

c# - Convert.ToInt32 出现问题并出现错误索引和长度必须引用字符串中的位置

linq - 简化 LINQ 查询

c# - 为什么这会呈现为 "System.Web.Mvc.SelectListItem"的列表?

c# - 为什么我的 SqlCommand 返回一个字符串,而它应该是一个 int?

c# - asp.net paypal重定向设置值到mysql

c# - C# mvc 中的 IEnumerable<SelectListItem>

c# - 使用 Linq to SQL 正确递增值

c# - 如何返回自定义匿名类型?