我需要从列表中仅加载5个元素而不加载所有列表。我有这两个实体:
public class Company
{
public int ID { get; set; }
public String Name{ get; set; }
public List<Employee> EmployeeList{ get; set; }
}
和
public class Employee
{
public int ID { get; set; }
public String Name{ get; set; }
}
我只需要为名为“CompanyName”的公司加载员工的最后5条记录。
我试图使用:
Company companySearch =systemDB.Companies
.Include("EmployeeList").Take(5)
.Where(d => d.Name.Equals("CompanyName"))
.SingleOrDefault();
但是这段代码会加载所有列表,之后只返回最后5条记录。我需要更快的查询。
PS:这是第一个EF的代码
答案 0 :(得分:2)
要加载OnStartup()
的选择性N记录,您必须具有一些标准,根据该标准过滤集合导航属性的成员。我已将该标准视为EmployeeList
实体的ID
属性的值。以下是代码段所需的所有步骤,这些步骤将为Employee
实体的EmployeeList
集合延迟加载
在继承的dbContext类的构造函数中启用延迟加载。我相信systemDB是继承自Company
DbContext
删除include子句以避免急切加载:
public SystemDB()
{
this.Configuration.LazyLoadingEnabled = true;
}
执行此行代码后,如果您检查Company companySearch =systemDB.Companies
.Where(d => d.Name.Equals("CompanyName"))
.SingleOrDefault();
对象的EmployeeList
属性,它将在快速监视窗口中显示为companySearch
。
使用下面提到的调用执行Null
属性的延迟加载。为过滤记录设置明确的标准。我设置了过滤条件来限制ID在1到5之间的员工,两个边界都是包容性的。
EmployeeList
答案 1 :(得分:1)
请注意,目前无法过滤加载了哪些相关实体。包含将始终引入所有相关实体。 Reference
你仍然可以在没有延迟加载的情况下尝试匿名投影
this.Configuration.LazyLoadingEnabled = false;
匿名投射。
Company companySearch =systemDB.Companies
.Where(d => d.Name.Equals("CompanyName"))
.Select(x=> new
{
company = x,
employees = x.Employees.Take(5),
}
.FirstOrDefault()
您将更加了解如何进行匿名投影here