在 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)
- 但这似乎没有帮助!
这是使用查询语法更容易完成的任务之一:
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 子句中b
和f
的范围变量。