【问题标题】:Entity MVC and ViewModels one to many exampleEntity MVC 和 ViewModels 一对多示例
【发布时间】:2014-06-07 05:35:28
【问题描述】:

我有一个简单的例子

我想显示公司和员工的列表

ACME
    David
    Simon
    Zac
Microsoft
    Kevin
    Paul

目前我做一个 linq 查询,返回公司模型,然后遍历模型树来获取员工。这很好用,但是使用 glimpse 我在上面的示例 3 查询中看到了它的作用。一个用于公司,然后 2 个用于员工的查询,每个公司一个。

我想知道是否有一个代表数据并填充数据的 ViewModel 会更好。但是,在尝试构建视图模型时,如果不进行多次查询,我不知道如何构建它。

var data =
    from company in db.Companies
    join employee in db.Employees on company.companyId equals employee.companyId
    orderby company.name, employee.name
    select new { companyName = company.name, employeeName = employee.name }

是否有一种简单的方法可以将其链接到视图模型,或者是否有另一种最佳实践方法来做这样简单的事情。

【问题讨论】:

    标签: asp.net entity-framework viewmodel


    【解决方案1】:

    您可以通过添加ToList()从数据库中一次往返获取数据:

    var data =
    (from company in db.Companies
    join employee in db.Employees on company.companyId equals employee.companyId
    orderby company.name, employee.name
    select new { companyName = company.name, employeeName = employee.name }).ToList();
    

    或获取公司类型而不是匿名类型

    var data = db.Companies.Include(t => t.Employees )
                .Select(t => new
                {
                    t.name,
                    Employees = t.Employees .Select(p => new { p.name})
                }).ToList();
    

    或者如果您想使用 ViewModel,请创建一个视图模型:

    public class CompanyVm
    {
        public string name { get; set; }
    
        public IEnumerable<Employee> Employees{ get; set; }
    }
    
    public class Employee
    {
        public string name { get; set; }
    }
    

    然后使用automapper来映射数据

    var comVm = data
                .Select(comp => AutoMapper.Mapper.DynamicMap(comp, comp.GetType(), typeof(CompanyVm)))
                .Select(comp => comp as CompanyVm).ToList();
    

    【讨论】:

      【解决方案2】:

      假设您已正确连接实体框架中的导航属性,您应该能够做到:

      var data = db.Companies
        .Include(i => i.Employees)
        .Tolist();
      

      然后你可以遍历它们:

      foreach (var company in data)
      {
        foreach (var employee in company.Employees)
        {
        }
      }
      

      不要忘记包含using System.Data.Entity;,否则您将无法使用强类型.Include() 方法。

      【讨论】:

      • 不确定这是一个 ViewModel 示例
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多