如何使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();
通常这不起作用,我怎么能做到这一点?
答案 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
成员不应为virtual
或db.Configuration.LazyLoadingEnabled
应为false
(即延迟加载应关闭,否则首次访问时,bData
个集合将完全重新加载。