我有两个数据库表,它们通过其中一个表中的属性进行链接。这些表在ASP .NET核心MVC应用程序中单独表示为模型。在控制器操作中,我有一个linq查询,它在两个表上执行连接,并从连接结果中选择一组列。我试图将此结果集发送到视图页面,以便数据可以显示在分页表中,但我不确定应该如何完成此操作。
过去,当使用ASP .NET MVC(非核心)时,我已经能够执行在控制器操作中返回结果集的存储过程,遍历结果集,使用数据构建列表和然后将列表存储在viewbag中,可以在视图中访问。我试图将EntityQueryable对象直接存储在viewbag中,但是我收到了一个错误,我不确定如何继续迭代它。
将从linq查询返回的数据发送到View页面的最佳方法是什么?
控制器操作代码:
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;
我的查询是返回来自多个表的数据(因为它是一个连接),因此来自查询结果的数据必须如此 被提取并分成两个不同的视图模型,这两个视图模型对应于连接中的表。
第一个viewmodel表示查询结果的每一行。第二个viewmodel只是一个列表,用于保存查询结果中包含的所有行。 我试图了解如何从查询结果中将数据提取到视图模型中,如我在此处所解释的那样。
答案 0 :(得分:0)
我会返回一个ViewModel。通常,您可以使用它向/从View和控制器发送数据。
我目前正在开展一个大型项目,而ViewModels对我来说效果很好。
查看此简短视频:
https://www.youtube.com/watch?v=m086xSAs9gA
我假设您的查询正常工作(我没有阅读)。
通过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(我假设您知道如何,当您观看我链接的视图时)。
请注意,在这种情况下,理想情况下ViewModel应该保存原始数据(如果您稍后计划将ViewModel序列化并将其发送到另一个客户端,这将使您的生活更轻松。)
在上面的代码中,我将任何复杂类型转换为基本类型,并且应该在每个元素上(注意我在ResortResults
上做了同样的事情,因为我将它们转换为ViewModel数组,即数组一个只包含原始数据的对象,因此没有深层次结构。)
我还将Take(10)
移到了代码的上方,因此您不需要为每个元素创建一个ViewModel,然后只需要10个!这只是浪费性能。通过将其移动到上侧,我们在创建ViewModel之前获取10个元素,即,我们仅为所需元素创建ViewModel。
我希望有所帮助。如果您需要任何进一步的帮助,请告诉我。