2016-05-25 22 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中),您的代碼都會被調用,您將可以獲取所需的任何內容。