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

时间:2014-12-09 21:09:53

标签: c# linq linq-to-sql

假设我在实体框架中有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表和一个指向Foo行的FooId表。我现在想要通过Fate上的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) - 但这似乎没有帮助!

1 个答案:

答案 0 :(得分:0)

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

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)
           }

仔细查看b by子句中的范围变量fthe group