LINQ查询从子元素集合中获取(计数)

时间:2016-09-04 07:21:46

标签: sql linq nested

如何使LINQ查询(我正在使用实体框架)返回子集合中的前n个元素?

以下是示例类

public class A {
    public int ID 
    public ICollection<B> bData
}

public class B {
    public int ID 
    public string Name
}

这是我在想的一种查询;

db.A.Where(a => a.ID == query_id).Include(a => a.bData.Take(count)).ToList();

通常这不起作用,我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

Include方法用于急切加载相关实体数据。它全有或全无,不能用于过滤,排序,分组等。

所以你要求的是投影(选择)。如果你投射到匿名或自定义类型(a.k.a.DTO对象)会更简单,因为EF不允许投影到实体类型。但它仍然可以通过在LINQ to Entities查询中使用匿名类型投影并在LINQ to Objects中进行第二次投影来将过滤后的子集合附加到其父实体,如下所示:

var result = db.A
    .Where(a => a.ID == query_id)
    .Select(a => new { a, bData = a.bData.Take(count).ToList() })
    .AsEnumerable() // Switch to LINQ to Object context
    .Select(x =>
    {
        x.a.bData = x.bData;
        return x.a;
    })
   .ToList();

请注意,要使上述内容有效,bData成员不应为virtualdb.Configuration.LazyLoadingEnabled应为false(即延迟加载应关闭,否则首次访问时,bData个集合将完全重新加载。