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

本文关键字:属性 导航 ViewModel 展开 平坦 | 更新日期: 2023-09-27 18:13:07

假设我有一个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,而不列出每一个属性?即,如果我在我的实体或实体类中添加/删除属性,我希望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; }
}

我将此标记为反射,因为我知道不使用反射可能无法实现。

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

看一下这个问题:如何创建LINQ表达式树来选择匿名类型

基本上他创建了一个可以在运行时投射匿名类型的类,您可以根据自己的使用进行调整。但是因为它是一个匿名类型,并且是在运行时生成的,所以你不会得到任何设计时对它的支持。由于类型是在运行时生成的,所以您可以将属性附加到投影上,以复制当前类中存在的属性。

老实说,我不知道你为什么要这样做,因为这是相当多的工作,但我想把我所知道的关于这个主题。