Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Group by和列表的Sum是最终的聚合结果_C#_Asp.net_Entity Framework_Linq_Arraylist - Fatal编程技术网

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
    的逻辑,我想保持我的代码完整,在返回最后一个
    结果
    变量之前,是否有方法对其进行分组和求和?是的,是否有方法对返回前的最后一个
    结果
    变量进行分组和求和?