实体MVC和ViewModels一对多的例子

时间:2014-06-07 05:35:29

标签: asp.net entity-framework viewmodel

我有一个简单的例子

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

ACME
    David
    Simon
    Zac
Microsoft
    Kevin
    Paul

目前,我执行linq查询,返回公司模型,然后遍历模型树以获取员工。这工作正常,但是使用一瞥我看到它在上面的示例3查询中做了。一个用于公司,然后两个查询员工每个公司一个。

我想知道我是否会更好地使用表示数据的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 }

是否有一种简单的方法可以将其与视图模型相关联,或者是否有另一种最简单的方法来执行此类简单的操作。

2 个答案:

答案 0 :(得分:2)

假设您已正确连接Entity Framework中的导航属性,您应该能够:

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()方法。

答案 1 :(得分:2)

通过添加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,请创建一个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();