LINQ 查询中的自联接并返回视图

Posted

技术标签:

【中文标题】LINQ 查询中的自联接并返回视图【英文标题】:Self join in LINQ query and return View 【发布时间】:2013-07-10 18:12:27 【问题描述】:

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

EmpID 名称 ManagerID 名称 电话 地址 1 迈克 3 开发人员 123456 德克萨斯 2 大卫 3 RM 123456 德里 3 Roger NULL GM 123456 达拉斯 4 结婚 2 开发商 123456 NY 5 约瑟夫 2 开发商 123456 新加坡 7 Ben 2 开发商 123456 孟买 8 史蒂文 3 TL 123456 班格罗尔

我需要把它改成名字

我的代码在控制器操作中

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.ObjectQuery1[&lt;&gt;f__AnonymousType16[System.Int32,System.String, System.String,System.String,System.Nullable1[System.Int32],System.String]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1[Mvc4application.Models.Employee]'。] System.Web.Mvc.ViewDataDictionary`1.SetModel(对象值) +405487

当然我理解这一点,因为我的观点是使用Mvc4application.Models.Employee type

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

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

【问题讨论】:

【参考方案1】:

您正在返回一个匿名对象,而您的视图被强类型化为IEnumerable&lt;mvc4application.models.employee&gt;

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

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>

【讨论】:

不错的答案,但为什么是 for 循环而不是 foreach 循环? 因为我就是讨厌它。有大量的博客文章说明了如何在 Razor 视图中使用 foreach 循环,并且 *** 上有大量关于为什么模型绑定不适用于集合的问题。只是当您使用带有 foreach 循环的强类型编辑器助手时,它们不会为输入字段生成正确的名称。在这种情况下,这并不重要,因为没有任何输入字段,但我只是不想教人们使用这些 foreach,因为我只是觉得下一个问题是为什么我不能将数据提交回我的控制器操作。 所以我使用 for 而不是 foreach 来预测 OP 可能提出的下一个问题 :-) 只要他用 Html.EditorFor 替换 Html.DisplayFor 并放置 @987654331 @ 进入 HTML 表单并尝试提交此表单,如果他使用 foreach,他会感到非常惊讶。 好的,我从来没有遇到过任何问题,但感谢您的澄清。 @Darin 谢谢。绝对这是一个不错的答案,但对于 ASP MVC 来说是新手,我有一个问题,只有一个属性(ManagerName)我们必须创建一个模型。我们可以使用匿名对象在视图中显示数据吗?

以上是关于LINQ 查询中的自联接并返回视图的主要内容,如果未能解决你的问题,请参考以下文章

返回 LINQ 查询结果的控制器方法

LINQ查询操作符

在 ASP.Net MVC 的视图中使用 2 个表(使用不同的模型返回 2 个 LINQ?)

linq查询中的异步任务方法问 题在c#中返回

SQL Server 递归自联接

LINQ查询操作符之FirstFirstOrDefaultLastLastOrDefaultElementAtElementAtOrDefaultContainsAnyAllCoun