我有一个实体Foo,它有一个属性" Type"。 我尝试按类型对数据进行分组,并从每种类型中获取5行。我创建了一个类FooGroup,它有一个属性Type和List。同时,每个Foo与其他4个实体相连,我试图使用Include来加载它们
public class FooGroup() {
public TypeEnum? Type{ get; set; }
public List<FooViewModel> Foos{ get; set; }
}
我目前的逻辑是:
var foos = ctx.Foo; // ctx = DBContext
foos = foos.Include(x => x.Bar); // Include all other entities
var groups = foos
.GroupBy(x => x.Type)
.Select(x => new FooGroup()
{
Type = x.Key,
Foos = x.Take(5).Select(foo => new FooViewModel(foo)).ToList()
})
.ToList();
没有错误,但Include已丢失,因为查询是由group by重新整形的。什么是保持包含的最佳方法?
答案 0 :(得分:2)
这是可能的,但你需要首先展平(取消组合)结果(获取每组所需的行数),然后应用包含,切换到LINQ to Objects上下文(在内存中)并在那里执行分组和最终投影:
var groups = ctx.Foo
.GroupBy(x => x.Type) // Group
.SelectMany(g => g.Take(5)) // Ungroup
.Include(x => x.Bar) // Include all other entities
.AsEnumerable() // Switch to LINQ to Objects
.GroupBy(x => x.Type) // Group again
.Select(g => new FooGroup() // Project
{
Type = g.Key,
Foos = g.Select(x => new FooViewModel(x)).ToList()
})
.ToList();