首页 > 解决方案 > 如何从 linq 查询发送数据到查看页面

问题描述

我有两个数据库表,它们通过其中一个表中的属性链接。这些表在 ASP .NET 核心 MVC 应用程序中分别表示为模型。在控制器操作中,我有一个 linq 查询,它对两个表执行连接并从连接结果中选择一组列。我正在尝试将此结果集发送到视图页面,以便数据可以显示在分页表中,但我不确定应该如何完成。

过去,当使用 ASP .NET MVC(非核心)时,我已经能够执行在控制器操作中返回结果集的存储过程,遍历结果集,使用数据构建列表,然后将列表存储在可以在视图中访问的视图包。我尝试将 EntityQueryable 对象直接存储在 viewbag 中,但出现错误,我不确定我将如何迭代它。

将从 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;

编辑:

我的查询返回来自多个表的数据(因为它是一个联接),因此必须将查询结果中的数据提取并分离到与联接中的表相对应的两个不同的视图模型中。

第一个视图模型代表查询结果的每一行。第二个视图模型只是一个列表,用于保存查询结果中包含的所有行。正如我在此处解释的那样,我正在尝试了解如何将查询结果中的数据提取到视图模型中。

标签: c#asp.netsql-serverentity-frameworkasp.net-core-mvc

解决方案


我会返回一个 ViewModel。通常,您可以使用它向视图和控制器发送数据/从视图和控制器发送数据。

我目前正在做一个大项目,而 ViewModel 对我来说工作得很好。

检查这个简短的视频:

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。

我希望这会有所帮助。如果您需要任何进一步的帮助,请告诉我。


推荐阅读