【问题标题】:How to send data from linq query to view page如何从 linq 查询发送数据到查看页面
【发布时间】:2018-05-06 19:09:16
【问题描述】:

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

过去,当使用 ASP .NET MVC(非核心)时,我已经能够执行在控制器操作中返回结果集的存储过程,遍历结果集,使用数据构建列表,然后存储可以在视图中访问的 viewbag 中的列表。我尝试将 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.net sql-server entity-framework asp.net-core-mvc


    【解决方案1】:

    我会改为返回一个 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。

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

    【讨论】:

    • 感谢您的链接,我观看了视频。我想了解的是在这种情况下应该如何使用视图模型。它应该用于存储查询结果的每一行还是整个行集,在这种情况下,视图模型将从控制器操作返回并传递给视图。我只是不确定如何构造视图模型,以便它将返回的数据公开为视图页面中的可迭代对象。一个简单的代码示例会有所帮助。谢谢
    • @loremIpsum1771,好的,正如我所说,我在我正在处理的项目中解决了很多次这样的问题。简而言之,您希望正确构建视图模型以便能够以正确的方式遍历某些对象,对吗?还请告诉该对象的哪一部分是对象的集合?只有报告详细信息?只需给我这些信息,我将很乐意为您重写该代码以适合 MVVM 模式。
    • 是的,所以我仍然是链接新手,并从我找到的示例中派生出我的 linq 查询。该查询从结果集 (.Take(10)) 中获取 10 行(如果我理解正确的话),所以我理解它的方式是 resultsObj 将存储包含数据库中 10 行的可查询对象。您似乎是在说将 resultsObj 存储为视图模型对象的属性,该对象将由操作返回并包含在视图页面中。如果是这种情况,我不确定如何遍历 viewmodel 的 resultsObj 属性来生成我正在尝试制作的 html 表。
    • select 语句中的所有内容(即Name = rd.Name, ImageUrl = rd.ImageUrl, ResortDetails = rd.ResortDetails,CheckIn = ra.CheckIn, Address = rd.Address, TotalPrice = ra.TotalPrice)将代表被选中的 10 行中的每一行 IIUC。所以,resortDetails 不是一个集合,只是每一行中的 varchar 属性。同样,我是使用 Linq 查询的新手,所以我可能误解了从 another example 派生的查询,但我只需要查询数据库并将返回的行发送到视图。
    • @loremIpsum1771 你说我不确定如何遍历 resultsObj 属性,我猜你的意思是属性,而不是属性,对吗?不,你没有完全理解我的意思,但我今天稍后会为你重写代码
    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 2014-08-13
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多