在实体框架中从数据库加载N条记录

时间:2016-06-07 10:42:41

标签: c# entity-framework linq

我需要从列表中仅加载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的代码

2 个答案:

答案 0 :(得分:2)

要加载OnStartup()的选择性N记录,您必须具有一些标准,根据该标准过滤集合导航属性的成员。我已将该标准视为EmployeeList实体的ID属性的值。以下是代码段所需的所有步骤,这些步骤将为Employee实体的EmployeeList集合延迟加载

  1. 在继承的dbContext类的构造函数中启用延迟加载。我相信systemDB是继承自Company

    的类的对象
    DbContext
  2. 删除include子句以避免急切加载:

    public SystemDB() { this.Configuration.LazyLoadingEnabled = true; }

  3. 执行此行代码后,如果您检查Company companySearch =systemDB.Companies .Where(d => d.Name.Equals("CompanyName")) .SingleOrDefault();对象的EmployeeList属性,它将在快速监视窗口中显示为companySearch

    1. 使用下面提到的调用执行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