2017-02-23 33 views
0

Как я могу преобразовать следующий тип SQL запроса в LINQ (Оба метода расширения синтаксиса и Синтаксис запросов),Преобразовать 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 
+0

Взгляните на https://www.linqpad.net/Download.aspx – Snowlockk

ответ

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

Я разделил запрос на 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; 
Смежные вопросы