我有一个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类中?
答案 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);