C# 如何在linq中按子实体的属性分组并得到子实体的和?

C# 如何在linq中按子实体的属性分组并得到子实体的和?,c#,.net,linq,asp.net-core,entity-framework-core,C#,.net,Linq,Asp.net Core,Entity Framework Core,我需要按子实体对数据进行分组,并获得子实体的总和。所以,我试过这个linq: context.Parent.Include(p => p.Child).GroupBy(p => p.Child.Type).Select(g => g.Sum(p => p.Child.Amount)); 以上linq将导致错误。然而,若我要得到父实体的总和,那个么它将起作用 context.Parent.Include(p => p.Child).GroupBy(p => p

我需要按子实体对数据进行分组,并获得子实体的总和。所以,我试过这个linq:

context.Parent.Include(p => p.Child).GroupBy(p => p.Child.Type).Select(g => g.Sum(p => p.Child.Amount));
以上linq将导致错误。然而,若我要得到父实体的总和,那个么它将起作用

context.Parent.Include(p => p.Child).GroupBy(p => p.Child.Type).Select(g => g.Sum(p => p.Amount));

为什么我不能得到子实体的和?

这是限制。在GroupBy之后,您不能使用导航属性。同样在GroupBy之后,所有包含都被完全忽略,所以省略它们

您可以按以下方式编写查询:

变量查询= 来自context.Parent中的p 按p.Child.Type将p.Child分组为g 选择新的 { 类型=g.键, 总和=总金额=>总金额 }; Lambda语法变量:

var query=context.Parent .GroupByp=>p.Child.Type,p=>p.Child .Selectg=>new { 类型=g.键, 总和=总金额=>总金额 };
显然,在你的模型中,你有一系列的父母。每个父对象都有一个属性子对象。每个子项都有两个属性:数量和类型

你忘了告诉我们你的规格,给了我们一些不符合你要求的代码。所以我们很难知道你想要什么

我认为您希望创建具有相同Parent.Child.Type值的父组。从组中的每个父项中,您要获取Parent.Child.Amount的值,并对这些值求和

您是对的,为此您应该使用Enumerable.GroupBy的一个重载。我的建议是使用带有参数resultSelector的重载:

// make groups of Parents with same value of Parents.Child.Type:
var result = dbContext.Parents.GroupBy(parent => parent.Child.Type,

// parameter resultSelector: for every Type, and all Parents that have this Child.Type
// make one new:
(type, parentsWithThisChildType) => new
{
    // do you want to know the type?
    ChildType = type,

    // from all parents in this group, select the Parent.Child.Amount and Sum them:
    TotalChildAmounts = parentsWithThisChildType
        .Select(parent => parent.Child.Amount)
        .Sum(),
})
换句话说:从父对象序列中创建父对象组,这些父对象组具有相同的Parent.Child.Type值。从每组制作一个对象,如下所示:

如果需要,则采用此组中所有Parent.Child.Type的通用类型 从组中的每个父项中,选择Parent.Child.Amount的值。 将此Amound的所有值相加,并将结果放入TotalChildAmounts
错误是什么?EF核心的哪个版本:2.0/2.1/3.x/5.x?我无法在lambda中实现上面的linq。你能提供lambda函数的实现吗?安装ReSharper并点击一下就可以完成。这将是丑陋和无法维护的。学习LINQ查询。@ranjeep,添加了Lambda语法变量。如果我需要按父实体的属性分组,并获取子实体的属性之和,该怎么办?正如您所提到的,按导航属性分组后无法使用,如何实现它?我指的是投影中的分组后。摸索键可以是导航属性。