Свести / развернуть столбцы свойства навигации для ViewModel? - PullRequest
1 голос
/ 31 октября 2011

Скажем, у меня есть сущность Employee, и у каждого Employee есть много сущностей EmployeeChange.

Employee и EmployeeChange выглядят так:

class Employee
{
  [Key]
  public int EmployeeKey {get;set;}

  public string EmployeeName { get; set; }

  public int CurrentEmployeeChangeKey { get; set; }
  [ForeignKey("CurrentEmployeeChangeKey")]    
  public virtual EmployeeChange CurrentEmployeeChange { 
    get { return EmployeeChanges.FirstOrDefault() ; } /*set;*/ }

  public virtual ICollection<EmployeeChange> EmployeeChanges { get; set; }    
}

class EmployeeChange
{
   [Key]
   public int EmployeeChangeKey { get; set; }

   public int EmployeeKey { get; set; }
   [ForeignKey("EmployeeKey")]       
   public virtual Employee Employee { get; set; }


   public string EmployeeStreet { get; set; }
   public string EmployeeCity { get; set; }
   public string Etc { get; set; }

   public DateTime ChangeEffective { get; set; }

}

Есть ли запрос LINQ, которыйвыровнять их, чтобы сделать что-то похожее на приведенное ниже для нас в MVC ViewModel, без перечисления каждого отдельного свойства? Т.е. если я добавляю / удаляю свойства в своем классе Entity или Entity, я хочу, чтобы запрос LINQ не должен был изменяться.Разумеется, приведенное ниже динамически генерируется из проекции в запросе LINQ, а не является фактически объявленным классом.Одна важная вещь заключается в том, что любые аннотации данных необходимо будет сохранить, чтобы они были доступны для представления:

class EmployeeCurrentChange
{    
   public string EmployeeName { get; set; }
   public string EmployeeStreet { get; set; }
   public string EmployeeCity { get; set; }
   public string Etc { get; set; }

   public DateTime ChangeEffective { get; set; }

//I don't need the below properties in the result, but if they 
//happen to be there I don't mind.
   public int EmployeeKey { get; set; }
   [ForeignKey("EmployeeKey")]       
   public virtual Employee Employee { get; set; }

   [Key]
   public int EmployeeKey {get;set;}

   public int CurrentEmployeeChangeKey { get; set; }
   [ForeignKey("CurrentEmployeeChangeKey")]    
   public virtual EmployeeChange CurrentEmployeeChange { 
     get { return EmployeeChanges.FirstOrDefault() ; } /*set;*/ }

   public virtual ICollection<EmployeeChange> EmployeeChanges { get; set; }    

   [Key]
   public int EmployeeChangeKey { get; set; }

}

Я отметил это как отражение, поскольку понимаю, что это невозможно без использования отражения.

1 Ответ

0 голосов
/ 01 ноября 2011

Взгляните на этот вопрос: Как создать дерево выражений LINQ для выбора анонимного типа

В основном он создает класс, который может проецировать анонимный тип во время выполнения, вы, вероятно, можетеадаптировать его для вашего использования.Но так как он является анонимным типом и генерируется во время выполнения, вы не получите никакой поддержки во время разработки.Поскольку тип генерируется во время выполнения, вы можете прикрепить атрибуты к проекции, чтобы скопировать то, что существует в текущем классе.

Честно говоря, не уверен, почему вы захотите сделать это, так как это довольно трудоемко, но решил,Я передал бы то, что я знал по этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...