Как правильно использовать Linq для ссылки на таблицу, которую вы создаете с помощью ViewModel, в виде списка для создания списка ‘SelectListItems’?

#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.Выберите, используя тип запроса, который я перечислил. Спасибо за другое предложение, но, как я пытался объяснить в своем вопросе, я уже могу получить список именно так, как я хочу, используя первый запрос, мой вопрос касается исключительно ссылки на таблицу ролей с использованием определенного стиля второго запроса, и то, что вы предложили, написано иначе, чем во втором запросезапрос. Короче говоря, моя проблема заключается не в достижении результата, а в достижении результата с использованием определенного формата, используемого во втором примере моего вопроса.