在GroupBy和Take之后使用LINQ Include

时间:2017-04-20 12:31:58

标签: c# linq

我有一个实体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重新整形的。什么是保持包含的最佳方法?

1 个答案:

答案 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();