展平/展开ViewModel的导航属性列?

时间:2011-10-31 17:28:45

标签: c# asp.net-mvc linq reflection

假设我有一个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中为我们制作类似下面的内容,而不会列出每个属性? I.e。如果我在我的Entity或Entity类中添加/删除属性,我希望LINQ查询不必更改。下面当然是从LINQ查询中的投影动态生成的,而不是实际声明的类。一个重要的事情是需要保留任何DataAnnotations,以便视图可以访问它们:

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 :(得分:0)

看看这个问题:How to create LINQ Expression Tree to select an anonymous type

基本上他创建了一个可以在运行时投影匿名类型的类,您可以根据自己的需要调整它。但由于它是一个匿名类型,并且它在运行时生成,因此您无法获得任何设计时支持。由于类型是在运行时生成的,但您可以将属性附加到投影以复制当前类中存在的内容。

老实说,不确定为什么你会想要这样做,因为它有相当多的工作,但我认为我会传递我对这个主题的了解。