在 Linq to SQL 中,如何按父属性对子项进行分组

本文关键字:属性 何按父 to Linq SQL | 更新日期: 2023-09-27 18:33:54

假设我在实体框架中有 2 个对象

public class Foo {
    int FooId {get;set}
    [ForeignKey("FooId")]
    public virtual ICollection<Bar> Bars { get; set; } 
    public DateTime ADate { get; set; }
}
public class Bar {
    int BarId { get; set; }
    int Data { get; set; }
}

即一个 Foo 表和一个带有 FooId 指向 Foo 行的 Bar 表。 我现在想按 Foo 上的 ADate 分组并对所有柱线日期求和以获得每天所有数据的总和:类似的东西(这显然是不正确的(

dbContext.Foos.GroupBy(x=>x.ADate.Day).Select(f=>f.Bars).Sum(b=>b.Data)

第一位

dbContext.Foos.GroupBy(x=>x.ADate.Day) 

返回一个IOrderedQueryable<IGrouping<int, Foo>> - 但是我想把它变成一个IOrderedQueryable<IGrouping<int, Bar>>,其中每个 Foo 都被其子 Bars 属性替换

希望有意义吗?(不得不稍微简化一下问题(

到目前为止,我得到的最好的是

 dbContext.Foos.GroupBy(x => x.ADate.Day)
                .OrderBy(x => x.Key)
                .Select(x => x.Sum(y => y.Bars.Sum(z => z.Data)));

总和 - 读起来丑陋且效率低下(尽管也许生成的 SQL 没问题?仍然看起来很丑陋(

编辑:好的 - 所以我意识到在小组中我可以做(x=>x.ADate.Day, x=>x.Bars) - 但这似乎没有帮助!

在 Linq to SQL 中,如何按父属性对子项进行分组

这是使用查询语法更容易完成的任务之一:

from f in Foos
from b in f.Bars
group b by f.ADate into g
select new { 
               g.Key,
               Sum = g.Sum(x => x.Data)
           }

仔细查看 the group by 子句中bf的范围变量。