2013-07-12 5 views
4

Я использую LINQ Self Join Query для отображения данных в таблице .my sql. В таблице sql содержатся некоторые данные о сотрудниках. Мне нужно показать данные о сотрудниках с их именем менеджера , так как это ManagerID в таблица, какSelf join in LINQ query and return View

 
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, системы .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 (значение объекта) +405487

Off Course Я понимаю это, потому что мой взгляд использует Mvc4application.Models.Employee type.

Поскольку я не могу отнести его к типу модели.

Можно ли использовать SQL-представление в качестве модели в MVC, чтобы мы могли вступать в SQL?

ответ

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> 
+1

Хороший ответ, но почему 'for' цикла, а не' foreach' цикл? –

+2

Потому что я просто ненавижу это. Есть gazillion сообщений в блогах, в которых показано, как использовать циклы foreach в представлениях Razor и gazillion вопросов о StackOverflow о том, почему привязка модели не работает для коллекций. Просто, когда вы используете строго типизированные помощники редактора с циклом foreach, они не будут генерировать собственные имена для полей ввода. В этом случае это не имеет значения, потому что нет никаких полей ввода, но я просто не хочу научить людей использовать эти foreach, потому что я просто чувствую, что следующий вопрос будет, почему я не могу отправить данные обратно мое действие контроллера. –

+0

Поэтому я использовал 'for' вместо' foreach' в ожидании возможных следующих вопросов от OP :-) Как только он заменяет Html.DisplayFor на Html.EditorFor и помещает '

' в форму HTML и пытается отправить эту форму, он будет неприятным сюрпризом, если он использовал foreach. –