【问题标题】:Convert SQL(complex ) to LINQ将 SQL(complex) 转换为 LINQ
【发布时间】:2017-07-13 14:19:36
【问题描述】:

如何将以下类型的 sql 查询转换为 LINQ(扩展方法语法和查询语法),

select t.Roll_Number,t.Status from (
    select * , 
      count(case when status <> 0 then 1 end) over(partition by Roll_Number,Subject_Code) c
    from table_1
) t where c = 0
GROUP BY t.Roll_Number,t.Status
ORDER BY t.Roll_Number

【问题讨论】:

标签: c# sql linq sql-to-linq-conversion


【解决方案1】:

试试这样的:

var result = data
            .GroupBy(x => new {x.RollNumber, x.SubjectCode})
            .Select(x => new {Group = x, Count = x.Count(item => item.Status != 0)})
            .SelectMany(x => x.Group.Select(item => new {item, x.Count}))
            .Where(x => x.Count == 0)
            .GroupBy(x => new {x.item.RollNumber, x.item.Status})
            .OrderBy(x => x.Key.RollNumber);

或在查询语法中:

var result = from x in data
                group x by new { x.RollNumber, x.SubjectCode } into g
                select new { Group = g, Count = g.Count(x => x.Status != 0) } into h
                from x in h.Group.Select(item => new {item, h.Count})
                where x.Count == 0
                group x by new { x.item.RollNumber, x.item.Status } into j
                orderby j.Key.RollNumber
                select j;

【讨论】:

    【解决方案2】:

    我把查询分成了3块,具体步骤比较容易理解。

    //count column 'c' for each row
    var rowsWithCount = from t in db.table_1
                        select
                        new
                        {
                            t.RollNumber,
                            t.SubjectCode,
                            t.Status,
                            c = db.table_1.Count(i => i.RollNumber == t.RollNumber && i.SubjectCode == t.SubjectCode && i.Status != 0)
                        };
    
    //add condition for 'c'
    rowsWithCount = rowsWithCount.Where(i => i.c == 0);
    
    //group and order results
    var groupedResult = from r in rowsWithCount
                        group r by new { r.RollNumber, r.Status }
                        into g
                        orderby g.Key.RollNumber
                        select g;
    

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多