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

У меня есть запрос linq (в Entity Framework Core), который объединяет две таблицы сервера sql, фильтрует результаты в предложении where, а затем выбирает набор столбцов из результатов.

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
                                  });
                ViewBag.resultSet = resultsObj;

Я создал класс viewmodel для хранения атрибутов строки результатов запроса и другой класс viewmodel, который содержит объект List для хранения всех экземпляров другой viewmodel, по существу функционирующий как коллекция длявсе строки, возвращаемые запросом:

public class ResortDataJoinObj
{
    public ResortData ResData { get; set; }
    public ResortAvailability ResAvail { get; set; }
}

public class ResortDealResultsObject
{
    public List<ResortDataJoinObj> resultsList { get; set; }
}

После того, как список создан, мне нужно импортировать его на страницу просмотра, чтобы результаты запроса могли быть сохранены в таблице.Я делал этот процесс получения результатов запроса раньше, за исключением хранимых процедур, где я мог выполнять итерацию по объекту считывателя и при необходимости сохранять возвращенные данные строки.Я знаю, что это стандартная практика передачи данных из контроллера в представление с использованием Viewmodels, но я все еще новичок в использовании запросов linq, поэтому я не уверен, как на самом деле извлечь данные, возвращенные из результатов запроса linq, и связать ихto viewmodels.

Как мне извлечь данные из результатов запроса linq и сохранить их в классах viewmodel?

Ответы [ 2 ]

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

Так как вы не предоставили HTML, позвольте мне помочь с другим SO ответом :

@model IList<MySolution.Models.MyClassEtc>

@{
    ViewBag.Title = "Home Page";
    Layout = "~/Views/Shared/_LayoutNoMenu.cshtml";
}


@foreach (var p in Model)
{ 
<div class="container">
@using (Html.BeginForm("About", "Home", FormMethod.Get, new { @class = "begin-form" }))
{
    <h1>Welcome</h1>
    <div class="required-field-block">
    <textarea rows="1" class="form-control" placeholder="Email" id="filter"></textarea>
    </div>
    <button class="btn btn-primary" type="submit">Login</button>

    @Html.TextBoxFor(model => model.ImageUrl, new { @class = "form-control" })
}
</div>
} 

Вам необходимо определить модель представления на своей странице вверху.

@model IList<MySolution.Models.MyClassEtc>

И вам нужно получить к нему доступ и повторить его, вот так:

@foreach (var p in Model)
{ 
    Debug.Write(p.Name);
    Debug.Write(p.ImageUrl); //etc
}

Это действительно здорово, это так просто, не правда ли?

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

Как бы я это сделал, создав объект класса, который будет иметь все свойства, которые вы хотите получить из возвращенного запроса linq. -

Итак, мы выполняем запрос linq и получаем результаты. Затем у нас будет новый вызов класса ViewModelOfPage (то, что мы будем возвращать на страницу), который будет иметь все свойства, которые мы хотим вернуть.

Наш класс будет выглядеть как -

public class ViewModelOfPage
{

public string Name {get;set;}
public string ImageUrl{get;set;}
public string ResortDetails {get;set;}
public string CheckIn {get;set;}
public string Address {get;set;}
public int TotalPrice {get;set;} 

// this may be a double in your example or w/e value you want it set to.                                   
}

Затем мы создадим этот объект класса в нашем контроллере, инициализируем его значениями из объекта obj, который мы вернули с помощью запроса linq, а затем отправим этот объект на страницу, где мы можем связать его свойства в представлении.

поэтому в нашем контроллере мы только что завершили запрос linq и получили наш объект resultsObj.

Затем мы инициализируем нашу модель представления следующим образом:

ViewModelOfPage vm = new ViewModelOfPage
{

Name = resultsObj.Name,
ImageUrl = resultsObj.ImageUrl ,
ResortDetails = resultsObj.ResortDetails,
CheckIn = resultsObj.CheckIn,
Address = resultsObj.Address,
TotalPrice resultsObj.TotalPrice

}

return View("ourView",vm);

Надеюсь, это поможет объяснить процесс, и именно так я и попытаюсь это сделать. Если есть лучшие способы, пожалуйста, объясните ниже :)

Просто к сведению, все это мой первый пост, так что я пишу код, скорее всего, неверным образом, поэтому я приношу извинения всем за боль, которую они могут испытывать при чтении: D надеюсь, у вас все будет хорошо во вторник.

Если вы хотите вернуть все строки на страницу, вы должны сделать:

List<ViewModelOfPage> vm = new ViewModelOfPage;
foreach (var row in resultsObj)
{
    //An example of only selecting certain results
    if(row.Name == "John" && row.TotalPrice > 15){
        var tempVm = new ViewModelOfPage
        {
            Name = row.Name,
            ImageUrl = row.ImageUrl ,
            ResortDetails = row.ResortDetails,
            CheckIn = row.CheckIn,
            Address = row.Address,
            TotalPrice row.TotalPrice
        };
        vm.add(tempVm);
    }
}
view("ourview",vm);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...