LINQ RowNumber, Aggregate (Sum) и GroupBy

У меня есть SQL-код, как;

Select GroupName, sum(LineAmount) as Total, WeekNumber,
    ROW_NUMBER() over (partition by WeekNumber order by sum(LineAmount) desc) as RowNum
from
    Invoices
where
    month(InvoiceDate)=month(getdate())
group by
    GroupName,WeekNumber

Я хотел бы преобразовать это в LINQ, но не повезло. Я использую LINQ to Object. Любая помощь будет оценена. ТИА

РЕДАКТИРОВАТЬ: Вот некоторые примеры данных и ожидаемый результат.

public class Invoice
{
    public string GroupName { get; set; }
    public int LineAmount { get; set; }
    public int WeekNum { get; set; }
}

   List<Invoice> theData = new List<Invoice>();
    theData.Add(new Invoice { GroupName = "A", LineAmount = 1, WeekNum = 1});
    theData.Add(new Invoice { GroupName = "A", LineAmount = 2, WeekNum = 1 });
    theData.Add(new Invoice { GroupName = "A", LineAmount = 3, WeekNum = 1 });
    theData.Add(new Invoice { GroupName = "A", LineAmount = 2, WeekNum = 2 });
    theData.Add(new Invoice { GroupName = "A", LineAmount = 3, WeekNum = 2 });
    theData.Add(new Invoice { GroupName = "A", LineAmount = 4, WeekNum = 2 });
    theData.Add(new Invoice { GroupName = "B", LineAmount = 4, WeekNum = 1 });
    theData.Add(new Invoice { GroupName = "B", LineAmount = 3, WeekNum = 1 });
    theData.Add(new Invoice { GroupName = "B", LineAmount = 7, WeekNum = 2 });
    theData.Add(new Invoice { GroupName = "B", LineAmount = 6, WeekNum = 2 });
    theData.Add(new Invoice { GroupName = "B", LineAmount = 5, WeekNum = 2 });

Я удалил "где" из моего первого запроса, так как на данный момент это не проблема.

3 ответа

Решение
theData
.GroupBy(g => new {g.GroupName, g.WeekNum}, (key, gg) => new {key.GroupName, key.WeekNum, Total = gg.Sum(g => g.LineAmount)})
.GroupBy(g => g.WeekNum, (weekNum, gg) => gg.OrderByDescending(g => g.Total).Select((g,i) => new {g.GroupName, g.Total, g.WeekNum, RowNum = i}))
.SelectMany(g => g)

Вы не указали язык, который вам нужен. Вот код на C#

int index = 0;
var filteredInvoices = (from i in invoices
where i.InvoiceDate.Month == DateTime.Now().Month
group i by new { i.GroupName, i.WeekNumber }
into ig
select new {i.GroupName, Total = ig.Sum(i => i.LineAmount), i.WeekNumber, RowNum = ++index}).OrderByDescending(n => n.Total);

FilterInvoices должен иметь желаемый результат. Также я предполагаю, что i.InvoiceDate имеет тип DateTime.

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

(theData.GroupBy(f => new { f.GroupName, f.WeekNum})
                .Select(r => new {r.Key.WeekNum, r.Key.GroupName, Total = r.Sum(f => f.LineAmount)}))
                .GroupBy(r => new {r.WeekNum}).SelectMany(
                    g =>
                    g.OrderByDescending(f => f.Total).Select(
                        (f, index) => new { f.GroupName, f.Total, f.WeekNum, Ix = index + 1 })) 
Другие вопросы по тегам