自我加入LINQ查询并返回View

时间:2013-07-12 08:43:05

标签: c# asp.net-mvc

我正在使用LINQ Self Join Query在视图上显示数据。我的sql表包含一些员工详细信息。我需要用他们的经理名称显示员工详细信息 因为它是表中的ManagerID

EmpID  Name ManagerID   Designation Phone   Address
1   Mike    3          Developer    123456  Texas
2   David   3           RM          123456  Delhi
3   Roger   NULL        GM          123456  Dallas
4   Marry   2          Developer    123456  NY
5   Joseph  2          Developer    123456  Singapore
7   Ben 2              Developer    123456  Mumbai
8   Steven  3          TL           123456  Banglore
 

我需要将其更改为名称

我的代码在控制器操作中

var emp = from m in t.Employees
          join e1 in t.Employees on m.ManagerID equals e1.EmployeeID
          select new { Id = m.EmployeeID , 
                       Name = m.Name, 
                       Manager = e1.Name , 
                       Designation = m.Designation,
                       Phone =m.Phone ,address = m.Address };

return View(emp.Tolist());

并在视图中

@model IEnumerable <mvc4application.models.employee>

但我收到运行时错误

  

传递到字典中的模型项是类型的   System.Data.Objects.ObjectQuery 1[<>f__AnonymousType1 6 [System.Int32,System.String,   System.String,System.String,System.Nullable 1[System.Int32],System.String]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1 [Mvc4application.Models.Employee]”。]   System.Web.Mvc.ViewDataDictionary`1.SetModel(Object value)+405487

关闭课程我理解这一点,因为我的观点是使用Mvc4application.Models.Employee type

因为我无法将其转换为模型类型。

我们可以在MVC中使用SQL视图作为模型,以便我们可以在SQL中加入吗?

1 个答案:

答案 0 :(得分:8)

您正在返回一个匿名对象,而您的视图强烈输入IEnumerable<mvc4application.models.employee>

我强烈建议您编写一个符合视图要求的视图模型,并在此视图中包含您希望使用的信息:

public class EmployeeViewModel
{
    public int EmployeeID { get; set; }
    public string Name { get; set; }
    public string ManagerName { get; set; }
    public string Designation { get; set; }
    public string Phone { get; set; }
    public string Address { get; set; }
}

然后调整您的LINQ查询,以便将各种域EF对象投影到视图模型中:

IEnumerable<EmployeeViewModel> employees = 
    from m in t.Employees
    join e1 in t.Employees on m.ManagerID equals e1.EmployeeID
    select new EmployeeViewModel
    { 
        EmployeeID = m.EmployeeID , 
        Name = m.Name, 
        ManagerName = e1.Name,
        Designation = m.Designation,
        Phone = m.Phone,
        Address = m.Address 
    };

    return View(employees.ToList());

最后使您的视图强烈输入视图模型:

@model IList<EmployeeViewModel>

现在您可以提供信息:

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Manager name</th>
            <th>Designation</th>
            <th>Phone</th>
            <th>Address</th>
        </tr>
    </thead>
    <tbody>
        @for (var i = 0; i < Model.Count; i++)
        {
            <tr>
                <td>@Html.DisplayFor(x => x[i].EmployeeID)</td>
                <td>@Html.DisplayFor(x => x[i].Name)</td>
                <td>@Html.DisplayFor(x => x[i].ManagerName)</td>
                <td>@Html.DisplayFor(x => x[i].Designation)</td>
                <td>@Html.DisplayFor(x => x[i].Phone)</td>
                <td>@Html.DisplayFor(x => x[i].Address)</td>
            </tr>
        }
    </tbody>
</table>