填充惰性<T> collection
Populating a Lazy<T> collection
我正在努力解决 ASP.Net MVC 应用程序中的延迟加载问题。例如,我有一个 class 和一个 属性,即 collection(员工)。我希望 collection 仅在我需要加载时加载:
public class Department
{
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int DepartmentId { get; set; }
public string DepartmentName { get; set; }
[ForeignKey("DepartmentId")]
public Lazy<ICollection<Employee>> Employees { get; set; }
}
首先,我不确定是否应该延迟加载 class 或 collection
public Lazy<ICollection<Employee>> Employees { get; set; }
public ICollection<Lazy<Employee>> Employees { get; set; }
我假设 collection。
接下来,我似乎无法找到一个相关的例子来实际加载 property/collection 一旦我需要它并且在 class 被实例化之后。我也不确定这是在 class 本身还是在我的 MVC 控制器中完成的。
感谢任何帮助。
对于延迟加载,您必须:
public virtual ICollection<Lazy<Employee>> Employees { get; set; }
。您实际上错过了允许框架通过覆盖 属性; 创建代理的 virtual
context.Configuration.ProxyCreationEnabled = true;
,这是默认值。
您不必在 Employees
属性 上使用 Lazy<T>
。您只会添加不必要的 "lazyness",因为 Entity Framework(以及其他 ORM,如 NHibernate)查询已经是惰性的,即:查询只会在您明确告诉它时才访问数据库。
因此,通过使 Employees
成为以下类型:
public virtual ICollection<Employee> Employees { get; set; } //make sure to mark it as virtual, otherwise it won't be lazy
查询时:
var result = myContextObj.Departments.Include(d=> d.Employees).Where(d=> d.Id == someID).SelectMany(d=> d.Employees);
上面的代码除了创建一个表示可能被发送到 database.But 的查询的查询对象之外什么都不做,它不会做任何事情,除非你 "materialize" 结果,或者通过执行例如 foreach
result
,或致电 ToList()
。
我正在努力解决 ASP.Net MVC 应用程序中的延迟加载问题。例如,我有一个 class 和一个 属性,即 collection(员工)。我希望 collection 仅在我需要加载时加载:
public class Department
{
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int DepartmentId { get; set; }
public string DepartmentName { get; set; }
[ForeignKey("DepartmentId")]
public Lazy<ICollection<Employee>> Employees { get; set; }
}
首先,我不确定是否应该延迟加载 class 或 collection
public Lazy<ICollection<Employee>> Employees { get; set; }
public ICollection<Lazy<Employee>> Employees { get; set; }
我假设 collection。
接下来,我似乎无法找到一个相关的例子来实际加载 property/collection 一旦我需要它并且在 class 被实例化之后。我也不确定这是在 class 本身还是在我的 MVC 控制器中完成的。
感谢任何帮助。
对于延迟加载,您必须:
public virtual ICollection<Lazy<Employee>> Employees { get; set; }
。您实际上错过了允许框架通过覆盖 属性; 创建代理的 context.Configuration.ProxyCreationEnabled = true;
,这是默认值。
virtual
您不必在 Employees
属性 上使用 Lazy<T>
。您只会添加不必要的 "lazyness",因为 Entity Framework(以及其他 ORM,如 NHibernate)查询已经是惰性的,即:查询只会在您明确告诉它时才访问数据库。
因此,通过使 Employees
成为以下类型:
public virtual ICollection<Employee> Employees { get; set; } //make sure to mark it as virtual, otherwise it won't be lazy
查询时:
var result = myContextObj.Departments.Include(d=> d.Employees).Where(d=> d.Id == someID).SelectMany(d=> d.Employees);
上面的代码除了创建一个表示可能被发送到 database.But 的查询的查询对象之外什么都不做,它不会做任何事情,除非你 "materialize" 结果,或者通过执行例如 foreach
result
,或致电 ToList()
。