2014-06-07 47 views
1

我有一個簡單的例子實體MVC和的ViewModels一對多例如

我想展示企業和員工

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

就可以得到加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(); 

,或者如果你想使用視圖模型,創建一個視圖模型:

public class CompanyVm 
{ 
    public string name { get; set; } 

    public IEnumerable<Employee> Employees{ get; set; } 
} 

public class Employee 
{ 
    public string name { get; set; } 
} 

然後使用自動映射器來映射數據

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

+0

不確定這是一個ViewModel示例 –