LINQ行数、聚合(总和)和分组比

LINQ行数、聚合(总和)和分组比,linq,row-number,Linq,Row Number,我有一个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,WeekNu

我有一个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来反对。任何帮助都将不胜感激。 短暂性脑缺血发作

编辑:这里是一些示例数据和预期结果

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 });
公共类发票
{
公共字符串组名{get;set;}
public int LineAmount{get;set;}
public int WeekNum{get;set;}
}
列出数据=新列表();
添加(新发票{GroupName=“A”,LineAmount=1,WeekNum=1});
添加(新发票{GroupName=“A”,LineAmount=2,WeekNum=1});
添加(新发票{GroupName=“A”,LineAmount=3,WeekNum=1});
添加(新发票{GroupName=“A”,LineAmount=2,WeekNum=2});
添加(新发票{GroupName=“A”,LineAmount=3,WeekNum=2});
添加(新发票{GroupName=“A”,LineAmount=4,WeekNum=2});
添加(新发票{GroupName=“B”,LineAmount=4,WeekNum=1});
添加(新发票{GroupName=“B”,LineAmount=3,WeekNum=1});
添加(新发票{GroupName=“B”,LineAmount=7,WeekNum=2});
添加(新发票{GroupName=“B”,LineAmount=6,WeekNum=2});
添加(新发票{GroupName=“B”,LineAmount=5,WeekNum=2});


我已经从我的第一个查询中删除了“where”,因为它目前不是问题。

您还没有指定所需的语言。这是C语言的代码#


filteredInvoices应该具有您想要的结果。另外,我假设I.InvoiceDate的类型为DateTime。

您尚未指定所需的语言。这是C语言的代码#

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)

filteredInvoices应该具有您想要的结果。我还假设I.InvoiceDate是DateTime类型。

Serg Rogovtsev回答给出了预期的结果。下面的代码就是我所做的。不知道哪个性能更好,但结果是一样的

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)
(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 })) 

Serg Rogovtsev的回答给了我预期的结果。下面的代码就是我所做的。不知道哪个性能更好,但结果是一样的

(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 })) 

我已经修改了我的问题。你能根据我的样本数据复习一下你的答案吗?我已经修改了我的问题。请您根据我的样本数据回顾一下您的答案。
RowNum=i
应该是
RowNum=i+1
才能给出预期的结果。谢谢Serg,您的解决方案给了我预期的结果。我也找到了解决办法。我不知道哪一个表现最好!任何想法都将受到赞赏,因为它们或多或少是相同的,选择是个人偏好和可读性的问题。一、 首先,不喜欢嵌套查询。
RowNum=I
应该是
RowNum=I+1
才能得到预期的结果。谢谢Serg,您的解决方案给了我预期的结果。我也找到了解决办法。我不知道哪一个表现最好!任何想法都将受到赞赏,因为它们或多或少是相同的,选择是个人偏好和可读性的问题。一、 首先,我不喜欢嵌套查询。