2016-09-30 1 views
0

Я хочу создать строго типизированный список ролей в моем контроллере вместе с двумя другими списками, которые будут использоваться в моем представлении в качестве различных фильтров для отправки электронной почты. Я знаю, что я могу создать список ролей, используя следующее:Каков правильный способ использования Linq для ссылки на таблицу, которую вы создаете, с помощью ViewModel в качестве списка для создания списка «SelectListItems»?

var viewModel = new ListViewModel 
     { 
      Roles = db.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Id.ToString(), Text = rr.Name }).ToList(), 
     }; 

Однако, как я и хотел передать два других списки на мой контроллер, я бы предпочел, чтобы достигнуть список ролей, написав запрос в следующим образом:

var viewModel = db.Roles 

      .Select(x => new SendGroupEmailViewModel 
      { 
       Roles = x.Select(rr => new SelectListItem { Value = rr.Id.ToString(), Text = rr.Name }).ToList(), 

      }; 

Таким образом, я могу затем достичь своих двух других списков в рамках одного и того же запроса, в отличие от предыдущего способа, где они должны быть эффективно отдельные запросы к БД. Очевидно, что то, что выше, не работает, я не могу. Выберите в таблице ролей, написав Roles = x.Select.

Мой вопрос: почему я не могу это сделать и как правильно обращаться к таблице ролей при написании ее аналогично вышеизложенному?

Просто, чтобы быть ясным, причина, по которой он должен быть var viewModel = db.Roles, потому что по какой-либо причине я не могу получить доступ к списку ролей идентификаторов/имен, иначе из-за того, как Identity устанавливается в MVC. Я знаю, что есть другие способы достижения этого списка, я просто хотел бы знать, как это можно сделать таким образом?

редактировать - Я хотел бы добавить, что роли в моем ViewModel выглядит следующим образом:

public IEnumerable<SelectListItem> Roles { get; set; } 
+0

вам нужно использовать (в viewbag или ViewModel) SelectList sList = новый SelectList (selectList, «Текст», «Значение», выбранный); – Emil

+0

Спасибо за ваш ответ, но я не уверен, как это отвечает на мой вопрос или помогает мне вообще, не могли бы вы объяснить, что вы имеете в виду? Как это вписывается в конкретный стиль запроса, который я написал во втором примере, и как он помогает мне ссылаться на таблицу ролей в том виде, в котором я нуждаюсь в этом запросе? – Rob

ответ

0

контроллер

var oList = db.Roles.Select(x => new SendGroupEmailViewModel 
       { 
        Roles = x.Roles.Select(rr => new SelectListItem { Value = rr.Id.ToString(), Text = rr.Name }).ToList(); 

    ViewData.myList = new SelectList(oList, 

       }, 
        "Value", "Text", 15); // 15 = selected item or you can omit this value 

Посмотреть

<%=Html.DropDownList("myList") %> 
+0

Спасибо за ваш ответ, но это не работает. Моя проблема в том, что я не могу прямо «выбрать» в таблице ролей, используя этот стиль запроса. Итак, x.Roles.Select или x.Select оба не работают. Я уже могу создать соответствующий список, поэтому часть ответа ViewData вашего ответа не требуется. – Rob

+0

какая ошибка/результат вы получаете? вы можете попробовать «var oList = from oRole in db.Roles select oRole» – Emil

+0

Ошибка в том, что .Выбрать не существует в контексте. Я не могу выбрать x.Select, используя тип запроса, который я перечисл. Спасибо за другое предложение, но, как я попытался объяснить в своем вопросе, я уже могу получить список именно так, как я хочу его, используя первый запрос, мой вопрос касается только ссылки на таблицу ролей с использованием определенного стиля второго запроса и того, что вы предположили, что во втором запросе написано по-другому. Короче говоря, моя проблема заключается не в достижении результата, а в достижении результата, используя конкретный формат, используемый во втором примере моего вопроса. – Rob

Смежные вопросы