如何在viewmodels中存储linq查询结果

时间:2018-05-09 16:09:52

标签: c# asp.net sql-server linq asp.net-core

我有一个linq查询(在Entity Framework Core中),它连接两个sql server表,过滤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; }
}

创建List之后,我基本上需要将其导入到视图页面中,以便查询结果可以存储在表中。我之前已经完成了获取查询结果的这个过程,除了存储过程,我能够迭代读取器对象并根据需要存储返回的行数据。我知道使用Viewmodels将数据从控制器传递到视图是标准做法,但我仍然是使用linq查询的新手,所以我不确定如何实际提取从linq查询结果返回的数据并绑定它查看模型。

如何从linq查询结果中提取数据并将其存储在viewmodel类中?

2 个答案:

答案 0 :(得分:3)

由于您未提供任何HTML,请让我帮助其他SO answer

@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
}

这真的很棒,这很容易,不是吗?

答案 1 :(得分:2)

如何执行此操作,将通过创建一个类对象,该对象将具有您从返回的linq查询中获得的所有属性。 -

所以过程是,我们执行linq查询并获得resultsObj 然后我们将有一个新类调用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.                                   
}

然后我们将在控制器中创建这个类对象,使用我们使用linq查询返回的obj中的值初始化它,然后将此对象发送到我们可以在视图中绑定其属性的页面。 p>

所以在我们的控制器中,我们刚刚完成了linq查询并得到了resultsObj对象。

然后我们将初始化我们的viewmodel,如:

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);