2016-05-25 44 views
0

我只是提出这个问题,明确有关.NET /实体框架一些混乱是可以实现延迟加载延迟加载/预先加载的概念/像我们为Database对象一样,Eager加载内存对象的概念。 我知道实体框架为数据库实体提供了内置的此功能。但我们可以用同样的方法(使用或不使用实体框架)在内存中的对象像类对象/列表等是否有可能实现对像列表(不与DB对象)内存对象

For example:

public class Student 
    { 
     public Student() { } 
     public Student(int studentId, string name, Address address, List<Subject> subjects) 
     { 
      StudentId = studentId; 
      Name = name; 
      Address = address; 
      Subjects = subjects; 
     } 

     public int StudentId { get; set; } 
     public string Name { get; set; } 
     public Address Address { get; set; } 
     public List<Subject> Subjects { get; set; } 
    } 
    public class Address 
    { 
     public string AddressLineOne { get; set; } 
     public string AddressLineTwo { get; set; } 
     public string City { get; set; } 
     public string State { get; set; } 
    } 
    public class Subject 
    { 
     public int SubjectId { get; set; } 
     public string SubjectName { get; set; } 
    } 

我创建Student类的对象,具有所有属性初始化:

public ActionResult Index() 
    { 
     Student std = new Student(1, "Stduent1", new Address { AddressLineOne = "#118 D-Road", City = "CHD", State = "CHD" }, 
      new List<Subject> { 
       new Subject{ SubjectId=1, SubjectName="History" }, 
       new Subject{ SubjectId=2, SubjectName="English" } 
      }); 

     return View(); 
    } 

All properties are initialized and filled 有没有我们可以加载只需求这个主题列表和地址对象的任何方式。

一种选择是,我可以initiaize地址和标题的列表,只有当我需要它。但是EF实现延迟加载的方式有可能吗?

我已经研究了关于懒惰< T>,但没有得到多少澄清相同。

请提供您宝贵的意见/建议。提前致谢。

+0

让每一个类型的成员是IEnumerable和使用查询,如选择(X => X ..)来得到,即使它可能是一个IEnumerable的一个项目所需的结果..你最终会加载一切很懒,可能的,你永远不会结束对变量== null –

+0

@devhedgehog,对不起,我没有明白你的观点,请你多解释一下。 – Gerry

+0

延迟加载在内存中只有结构没有任何的意义* *很大,除非您稍后提供的数据是完全随机的 - 这些数据必须来自某处。那么你打算怎么做 - 将所有数据存储在'Student'对象中,直到请求'Address'并填充它? “学生”对象中的数据将采用何种形式?当你只需要一个地址时,这是不是只有两个地址表示,并且它已经可用。 –

回答

1

我不太清楚为什么你要的东西已经在内存延迟加载,但你可以用的IEnumerable做,如果我理解你想要的正确实现:

public class Student 
{ 
    public IEnumerable<Subject> Subjects 
    { 
     get 
     { 
      for (int i = 0; i < 5; i++) 
      { 
       yield return new Subject(); 
      }     
     } 
    } 

} 

你不” t需要收益回报,但这一切都取决于你如何得到你的主题。因此,每次调用MoveNext(例如,在foreach中),您的代码都会被调用,您将可以获取所需的任何内容。

相关问题