【问题标题】:How bypass n+1, correct domain -> ViewModel.FromMyDomain approach如何绕过 n+1,正确的域 -> ViewModel.FromMyDomain 方法
【发布时间】:2012-05-29 06:42:14
【问题描述】:

假设我有一个包含一些字段的实体和一个这样的集合

Entity
int Id {get; set;}
string Name {get; set;}
string Title {get; set;}
List<Order>Orders {get; set;}

Order
int Id {get; set;}
string Name {get; set;}
Entity Entity {get; set;}

现在我想创建 EntityOrderViewModel,它只代表两个实体的几个属性。像这样

EntityOrderViewModel
int Id {get; set;}
string EntityName {get; set;}
string EntityTitle {get; set;}
string OrderName {get; set;}
int OrderId {get; set;}

EntityOrderViewModel(Entity x)
{
   Id = 1; 
   EntityName = x.Name; 
   EntityTitle = x.Title;
   foreach(Order order in x.Orders)
   {
      OrderName = order.Name;
   }
}

public static List<EntityOrderViewModel> FromMyDomain(IList<Entity> x)
{
    List<EntityOrderViewModel> vm= new List<EntityOrderViewModel>();

    foreach (Entity e in x)
    {
        vm.Add(new EntityOrderViewModel(e));
    }
    return vm;
}

现在我想从我的控制器中调用所有这样的实体

//opensession
   // open transaction
      List<Entity> data = session.Query<Entity>().ToList();
   //end transaction
      transaction.commit();
//end session      
      return EntityOrderViewModel.FromMyDomain(data);

【问题讨论】:

    标签: c# asp.net-mvc-3 linq nhibernate viewmodel


    【解决方案1】:

    既然你在控制器中有你的会话,为什么不直接水合视图模型呢?

    from entity in session.Query<Entity>()
    join order in session.Query<Order> join entity.EntityId on order.Entity.EntityId
    select new EntityOrderDTO // or anon 
    {
      EntityId = entity.EntityId,
      Name = entity.Name,
      OrderName = order.OrderName
    }
    

    加入会照顾你的 n+1

    【讨论】:

    • 我宁愿不使用连接,它们让我害怕 :) 如果我明白我可以在会话中使用 new EntityViewModel{ Id = entity.Id} 等?
    • 加入吓唬你!伙计:)!当您投影即EntityId = entity.EntityId时,会生成相应的sql投影。如果您确实选择了实体然后尝试翻译它,那么您将拥有一个 n+1 情境实体 --> 订单。 Join 是完全例外/合理的,并且是数据存储多个表时的唯一解决方案,因此总结起来,您要么加入查询,要么加入映射,无论哪种方式加入都会发生
    • 好的,join(t) 是的。我想我必须学习它。不过还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2010-09-16
    • 2016-09-06
    相关资源
    最近更新 更多