#c# #asp.net-mvc #linq #asp.net-mvc-3 #asp.net-mvc-4
#c# #asp.net-mvc #linq #asp.net-mvc-3 #asp.net-mvc-4
Вопрос:
Я хочу сгенерировать строго типизированный список ролей в моем контроллере вместе с двумя другими списками, которые, на мой взгляд, будут использоваться в качестве различных фильтров для отправки электронной почты. Я знаю, что могу сгенерировать список ролей, используя следующее:
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, заключается в том, что по какой-либо причине я не могу получить доступ к списку ролей ID / Name в противном случае из-за того, как Identity настраивается в MVC. Я знаю, что есть другие способы получения списка, я просто хотел бы знать, как это можно сделать таким конкретным способом?
редактировать — я должен добавить, что роли в моей ViewModel следующие:
public IEnumerable<SelectListItem> Roles { get; set; }
Комментарии:
1. вам нужно использовать (в viewbag или viewmodel) список выбора sList = новый список выбора (список выбора, «Текст», «Значение», выбрано);
2. Спасибо за ваш ответ, но я не уверен, как это отвечает на мой вопрос или вообще помогает мне, не могли бы вы объяснить, что вы имеете в виду? Как это вписывается в конкретный стиль запроса, который я написал во втором примере, и как это помогает мне ссылаться на таблицу ролей так, как мне требуется в этом запросе?
Ответ №1:
контроллер
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") %>
Комментарии:
1. Спасибо за ваш ответ, но это не работает. Моя проблема в том, что я не могу напрямую «.Select» в таблице ролей, используя этот стиль запроса. Итак, x.Роли. Выберите или x.Выберите оба варианта не работают. Я уже могу сгенерировать соответствующий список, поэтому часть ViewData вашего ответа не требуется.
2. какую ошибку / результат вы получаете? можете ли вы попробовать «var oList = from oRole в db.Роли выберите oRole»
3. Ошибка в том, что . Select не существует в контексте. Я не могу x.Выберите, используя тип запроса, который я перечислил. Спасибо за другое предложение, но, как я пытался объяснить в своем вопросе, я уже могу получить список именно так, как я хочу, используя первый запрос, мой вопрос касается исключительно ссылки на таблицу ролей с использованием определенного стиля второго запроса, и то, что вы предложили, написано иначе, чем во втором запросезапрос. Короче говоря, моя проблема заключается не в достижении результата, а в достижении результата с использованием определенного формата, используемого во втором примере моего вопроса.