如何将数据从linq查询发送到查看页面

时间:2018-05-06 19:09:16

标签: c# asp.net sql-server entity-framework asp.net-core-mvc

我有两个数据库表,它们通过其中一个表中的属性进行链接。这些表在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只是一个列表,用于保存查询结果中包含的所有行。 我试图了解如何从查询结果中将数据提取到视图模型中,如我在此处所解释的那样。

1 个答案:

答案 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。

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