C# Group by和列表的Sum是最终的聚合结果
表数据为:C# Group by和列表的Sum是最终的聚合结果,c#,asp.net,entity-framework,linq,arraylist,C#,Asp.net,Entity Framework,Linq,Arraylist,表数据为: Info ----------------------------------------------- num name age expenseN cost group 1 a 20 2 b 21 InfoDetail ----------------------------------------------- num expenseN cost group 1 001
Info
-----------------------------------------------
num name age expenseN cost group
1 a 20
2 b 21
InfoDetail
-----------------------------------------------
num expenseN cost group
1 001 10.00 x
2 001 20.00 x
3 002 20.00 x
4 003 30.00 y
这是代码:
public class _infoRepository
{
public string name { get; set; }
public int age { get; set; }
public string expenseN { get; set; }
public decimal cost { get; set; }
public string group { get; set; }
}
public class _infoDetailRepository
{
public string expenseN { get; set; }
public decimal cost { get; set; }
public string group { get; set; }
}
List<Info> result = new List<Info>();
var listInfoDetail = _infoDetailRepository.Query(p => p.group == "x").ToList();
var info1 = _infoRepository.Query(p => p.name = "a").FirstOrDefault();
for (int i = 0; i < listInfoDetail.Count; i++)
{
result.Add(new Info()
{
name = info1.name,
age = info1.age,
expenseN = listInfoDetail[i].expenseN,
cost = listInfoDetail[i].cost,
group = listInfoDetail[i].group
});
}
var info2 = _infoRepository.Query(p => p.name = "b").FirstOrDefault();
for (int i = 0; i < listInfoDetail.Count; i++)
{
result.Add(new Info()
{
name = info2.name,
age = info2.age,
expenseN = listInfoDetail[i].expenseN,
cost = listInfoDetail[i].cost,
group = listInfoDetail[i].group
});
}
return result;
但是,这不是我想要的结果,我期望的结果是这样的:
result
--------------------------------------------------
num name age expenseN cost group
1 a 20 001 30.00 x
2 a 20 002 20.00 x
3 b 21 001 30.00 x
4 b 21 002 20.00 x
毕竟,我想分组并对
result
变量求和,以得到所需的结果。在这种情况下,请有人帮助我,谢谢var listInfoDetail=\u infoDetailRepository.Query(p=>p.group==“x”).ToList()代码>
在InfoDetail
表中有3个条目,其中group==“x”
。因此,listInfoDetail
有3项。你这样做两次,结果是6。行为如预期
我想对结果变量进行分组和求和,以得到所需的结果
如果您不想对逻辑进行更改,可以使用结果变量并执行类似的操作,即按expenseN
和name
进行分组,然后对成本进行求和
var resultGrouped = result
.GroupBy(x => new { x.expenseN, x.name })
.Select(y => new Info()
{
name = y.Key.name,
age = y.FirstOrDefault().age,
expenseN = y.Key.expenseN,
cost = y.Sum(z => z.cost),
group = y.FirstOrDefault().group
}).ToList();
但这是对LINQ的一种非常低效的使用。您应该注意改进以下方面:
重复的代码。对于p.name=“a”
和p.name=“b”
不必要的ToList()
。您可以使用.Join()
最终,所有这些代码都可以用一条链式LINQ语句存档,这样会更加高效和简短。var listInfoDetail=\u infoDetailRepository.Query(p=>p.group==“x”).ToList()代码>
在InfoDetail
表中有3个条目,其中group==“x”
。因此,listInfoDetail
有3项。你这样做两次,结果是6。行为如预期
我想对结果变量进行分组和求和,以得到所需的结果
如果您不想对逻辑进行更改,可以使用结果变量并执行类似的操作,即按expenseN
和name
进行分组,然后对成本进行求和
var resultGrouped = result
.GroupBy(x => new { x.expenseN, x.name })
.Select(y => new Info()
{
name = y.Key.name,
age = y.FirstOrDefault().age,
expenseN = y.Key.expenseN,
cost = y.Sum(z => z.cost),
group = y.FirstOrDefault().group
}).ToList();
但这是对LINQ的一种非常低效的使用。您应该注意改进以下方面:
重复的代码。对于p.name=“a”
和p.name=“b”
不必要的ToList()
。您可以使用.Join()
最终,所有这些代码都可以用一条链式LINQ语句存档,这样会更高效、更短。以下代码将有助于简化现有代码,并帮助您获得所需的结果
var result = from p in InfoDetails
where p.groups == "x"
group p by new { p.expenseN } into g
from c in Info
orderby c.name, g.FirstOrDefault().expenseN
select new
{
name = c.name,
age = c.age,
expenseN = g.FirstOrDefault().expenseN,
cost = g.Sum(x=>x.cost),
groups = g.FirstOrDefault().groups
};
或
以下代码将有助于简化现有代码,并帮助您获得所需的结果
var result = from p in InfoDetails
where p.groups == "x"
group p by new { p.expenseN } into g
from c in Info
orderby c.name, g.FirstOrDefault().expenseN
select new
{
name = c.name,
age = c.age,
expenseN = g.FirstOrDefault().expenseN,
cost = g.Sum(x=>x.cost),
groups = g.FirstOrDefault().groups
};
或
嗨,Slack Groverglow,我想保持代码的完整性,有没有办法对最后一个结果
变量进行分组和求和?是的,但是你需要按expenseN
和name
进行分组,而不是expenseN
和Group
,但我需要遵循Group by
的逻辑,我想保持代码的完整性,在返回最后一个结果
变量之前,有没有办法对其进行分组和求和?是的,有没有办法在返回前对最后一个结果
变量进行分组和求和?嗨,Slack Groverglow,我想保持代码的完整性,有没有办法对最后一个结果
变量进行分组和求和?是的,但是您需要按expenseN
和name
进行分组,而不是expenseN
和Group
,但是我需要遵循这个Group by
的逻辑,我想保持我的代码完整,在返回最后一个结果
变量之前,是否有方法对其进行分组和求和?是的,是否有方法对返回前的最后一个结果
变量进行分组和求和?