2016-05-25 7 views
0

Я просто задаю этот вопрос, чтобы устранить некоторую путаницу в отношении .Net/Entity Framework, которая позволяет реализовать ленивую загрузку/Нежелательные концепции загрузки объектов памяти, как и для объекта Database. Я знаю, что Entity Framework предоставляет эту функцию, встроенную для объектов базы данных. Но мы можем использовать тот же подход (с использованием или без использования Entity Framework) для в объекте памяти как объекты класса/список и т.д.Возможно ли реализовать концепцию ленивой загрузки/загрузкой объекта памяти, такого как List (не с объектами 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; } 
    } 

Я создал объект класса студентов со всеми свойствами инициализации:

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 есть ли способ, что мы можем загрузить этот список Темы и адрес объект только на спросе.

Одним из вариантов является то, что я могу инициировать адрес и список объектов только тогда, когда мне это нужно. Но возможно ли, как EF реализует ленивую загрузку.

Я изучил Lazy < T>, но не получил много разъяснений для этого же.

Просьба предоставить ценные отзывы/предложения. Заранее спасибо.

+0

Пусть каждый тип элементов является IEnumerable и использует такие запросы, как Select (x => x ..), чтобы получить желаемый результат, даже если он может быть IEnumerable с одним элементом. Вы в конечном итоге загрузите все как ленивые, как возможно, и вы никогда не закончите борьбу с переменной == null –

+0

@devhedgehog, извините, я не понял вашу мысль, не могли бы вы объяснить немного больше. – Gerry

+0

Lazy loading для встроенных в память структур не делает много * смысла *, если только данные, которые вы поставляете позже, не являются случайными, - данные должны откуда-то исходить. Итак, что вы собираетесь делать - хранить все данные внутри объекта «Студент» до тех пор, пока не будет запрошен «Адрес», а затем его заполнить? в какой форме будут использоваться данные в объекте «Студент»? Разве это не оставляет вас только с двумя представлениями адреса, когда вы на самом деле нуждаетесь в нем, и он уже доступен. –

ответ

1

Я не совсем уверен, почему вы хотите, отложенную загрузку чего-то, что уже в памяти, но вы можете сделать это с IEnumerable, если я понял, что вы хотите, чтобы правильно достичь:

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

} 

Вы надеваете» t нужно вернуть доход, но все зависит от того, как вы получаете свои предметы. Поэтому каждый раз, когда вызывается MoveNext (например, внутри foreach), ваш код будет вызываться, и вы сможете получить все, что вам нужно.