Как отправить данные из запроса linq на страницу просмотра - PullRequest
0 голосов
/ 06 мая 2018

У меня есть две таблицы базы данных, которые связаны атрибутом в одной из таблиц. Таблицы отдельно представляются в виде моделей в приложении ASP .NET core MVC. В действии контроллера у меня есть запрос linq, который выполняет объединение двух таблиц и выбирает набор столбцов из результатов объединения. Я пытаюсь отправить этот набор результатов на страницу просмотра, чтобы данные могли отображаться в разбитой на страницы таблице, но я не уверен, как именно это должно быть сделано.

В прошлом при использовании ASP .NET MVC (не ядра) мне удавалось выполнять хранимые процедуры, которые возвращают наборы результатов в действиях контроллера, перебирать наборы результатов, создавать списки с данными и затем сохранять списки в viewbag, которые могут быть доступны в представлении. Я пытался напрямую сохранить объект EntityQueryable в окне просмотра, но получил ошибку, и я не уверен, как бы я все равно повторил его.

Как лучше всего отправить данные, возвращенные из запроса linq, на страницу просмотра?

Код действия контроллера:

 var resultsObj = (from rd in _db.ResData
                                  join ra in _db.ResAvailability on rd.RecNo equals ra.RecNoDate
                                  where ra.TotalPrice < Int32.Parse(resDeals.priceHighEnd) && ra.TotalPrice > Int32.Parse(resDeals.priceLowEnd)

                                  select new
                                  {
                                      Name = rd.Name,
                                      ImageUrl = rd.ImageUrl,
                                      ResortDetails = rd.ResortDetails,
                                      CheckIn = ra.CheckIn,
                                      Address = rd.Address,
                                      TotalPrice = ra.TotalPrice
                                  }).Take(10);
                ViewBag.resultSet = resultsObj;

EDIT:

Мой запрос возвращает данные из нескольких таблиц (поскольку это соединение), поэтому данные из результатов запроса должны быть извлечены и разделены на две разные модели представления, которые соответствуют таблицам в соединении.

Первая модель представления представляет каждую строку результатов запроса. Вторая модель представления - это просто список для хранения всех строк, содержащихся в результатах запроса. Я пытаюсь понять, как выполнить извлечение данных из результатов запроса в модели представления, как я объяснил здесь.

1 Ответ

0 голосов
/ 06 мая 2018

Я бы вместо этого вернул ViewModel. Обычно вы можете использовать его для отправки данных в / из View и контроллера.

В настоящее время я работаю над большим проектом, и ViewModels работают очень хорошо для меня.

Проверьте это короткое видео:

https://www.youtube.com/watch?v=m086xSAs9gA

UPDATE

Я предполагаю, что ваш запрос работает правильно (я его не читал).

Чтобы отправить ваши данные через ViewModel в View.

Сначала создайте необходимые классы ViewModel:

public class PageNameViewModel
{
    public string Name { get; set; }
    public IEnumerable<ResortDetailViewModel> ResortDetailViewModels { get; set; }
    ... rest of properties are not shown for clarity ...
}

public class ResortDetailViewModel
{
    public string Detail1 { get; set; }
    public int Detail2 { get; set; }
    ... etc. ...
}

Теперь используйте ViewModels в контроллере (или, скажем, заполните данные в viewmodel):

var viewModel = (from rd in _db.ResData
                                  join ra in _db.ResAvailability on rd.RecNo equals ra.RecNoDate
                                  where ra.TotalPrice < Int32.Parse(resDeals.priceHighEnd) && ra.TotalPrice > Int32.Parse(resDeals.priceLowEnd)
                                  .Take(10)
                                  select new ClassNameViewModel
                                  {
                                      Name = rd.Name,
                                      ImageUrl = rd.ImageUrl,
                                      ResortDetailViewModels = rd.ResortDetails.Select(o => 
                                                                          new ResortDetailViewModel
                                                                          {
                                                                               Detail1 = o.detail1,
                                                                               Detail2 = o.detail2,
                                                                               ... etc. ...
                                                                          },
                                      CheckIn = ra.CheckIn,
                                      Address = rd.Address,
                                      TotalPrice = ra.TotalPrice
                                  });

return View(viewModel);

Теперь вы можете использовать ViewModel в представлении (я полагаю, вы знаете, как, когда вы наблюдали за представлением, которое я связал).

Обратите внимание, что в этом случае ViewModels в идеале должна содержать примитивные данные (это облегчит вашу жизнь, если вы позже планируете сериализовать ViewModel и отправить ее другому клиенту).

В приведенном выше коде я преобразовал любые сложные типы в примитивные типы, и это должно быть на каждом элементе (обратите внимание, я сделал то же самое на ResortResults, так как я преобразовал их в массив ViewModel, то есть массив объекты, которые содержат только примитивные данные, поэтому нет глубокой иерархии).

Я также переместил Take(10) в верхнюю часть кода, поэтому вам не нужно создавать ViewModel для каждого элемента, а затем взять только 10! это просто напрасная трата производительности. Перемещая его в верхнюю часть, мы берем 10 элементов перед созданием ViewModels, то есть мы создаем ViewModels только для необходимых элементов.

Надеюсь, это поможет. Если вам нужна дополнительная помощь, пожалуйста, скажите мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...