LINQ результат для просмотра

1

Какой простой способ вернуть результат запроса LINQ к представлению?

У меня есть запрос LINQ в моем контроллере, который получает результат из базы данных, но я как бы проиграл, как вернуть его в представление.

контроллер:

public ActionResult Index()
{
    if (Session["UserId"] == null)
    {
        return RedirectToAction("Index", "Login");
    }
    else
    {    
        EmployeeHomeViewModel model = new EmployeeHomeViewModel();

        var UserId = from x in db.Employees
                     where x.Employee_Id == Convert.ToInt32(Session["UserId"])
                     select x;

        //DISPLAY RESULT       

        var project = from x in db.Projects
                      where x.Employee_Id == Convert.ToInt32(Session["UserId"])
                      select x;
        foreach (Project result in project)
        {
            model.Project.Project_Id = result.Project_Id;
            model.Project.Project_Name = result.Project_Name;
            model.Project.Project_Detail = result.Project_Detail;             
        }

        //DISPLAY RESULT

    }

    return View();
}

Посмотреть:

@model ProjectManager.ViewModels.EmployeeHomeViewModel
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<div>Hello, @Html.DisplayFor(model => model.Employee.Employee_FirstName)</div><br />
<div>Current project: @Html.DisplayFor(model => model.Project.Project_Id)</div><br />
<div>Project name: @Html.DisplayFor(model => model.Project.Project_Name)</div><br />
<div>Details: @Html.DisplayFor(model => model.Project.Project_Detail)</div><br />

Модель:

public class EmployeeHomeViewModel
{
    public Employee Employee { get; set; }
    public Project Project { get; set; }        
}

Редактировать:

Чтобы быть ясным, прежде чем даже вернуть результат запроса LINQ в представление, я должен исправить ошибку, которая возникает при выполнении запроса в моем цикле foreach:

LINQ to Entities не распознает метод "Int32 ToInt32 (System.Object)", и этот метод не может быть переведен в выражение хранилища

Теги:
linq
razor
entity-framework
asp.net-mvc

2 ответа

1
Лучший ответ

Вы должны заменить return View(); с return View(model); ,

Несколько перегрузок метода Controller.View доступны для поддержки, указав столько, сколько вам нужно, чтобы вернуть ViewResult. В этом случае вам нужна перегрузка Controller.View(Object) а не Controller.View() перегрузка Controller.View(); параметр Object первого - это указать модель, на которой вы хотите ViewResult возвращаемый ViewResult.

  • 0
    Сделал это, но я получил эту ошибку в моем foreach. LINQ to Entities не распознает метод метода Int32 ToInt32 (System.Object), и этот метод нельзя преобразовать в выражение хранилища.
  • 0
    Это совершенно другой вопрос ... на который уже был дан ответ на SO . (Как правило, добавьте .Value в конец каждого оператора в вашем foreach .)
Показать ещё 2 комментария
0

Я получил эту ошибку в своем foreach.

LINQ to Entities не распознает метод 'Int32 ToInt32(System.Object)', и этот метод не может быть переведен в выражение хранилища

EF напрямую не поддерживает метод Convert.ToInt32(). В вашем случае это достаточно простое исправление - просто преобразуйте переменную сеанса за пределы запроса (и повторно используйте его):

    int userID = Convert.ToInt32(Session["UserId"]);

    //DISPLAY RESULT       

    var project = from x in db.Projects
                  where x.Employee_Id == userID
                  select x;

Несколько других вещей, которые я вижу:

  • Вы не используете запрос UserId вообще
  • Вы повторяете результаты запроса project но каждый раз переписываете одинаковые значения. Я подозреваю, что ваша модель EmployeeHomeViewModel должна иметь коллекцию проектов вместо одного проекта.
  • 0
    @D Стэнли 1) Да, я просто скопирую и вставлю код для запроса проекта, когда он заработает. 2) Я все равно получаю только 1 результат. Знаете более эффективный способ? Спасибо, что ответили .. edit: получил ошибку, указывающую на первое утверждение моего foreach. Ссылка на объект не установлена на экземпляр объекта.
  • 0
    Добавьте '.Single () `после вашего запроса, чтобы получить только один объект.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню