加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_汕头站长网 (https://www.0754zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > Asp教程 > 正文

Asp.net mvc 低效的MVC ViewModel对数据库进行多次调用?

发布时间:2022-09-27 14:07:21 所属栏目:Asp教程 来源:
导读:  Asp.net mvc 低效的MVC ViewModel对数据库进行多次调用?

  asp.net-mvclinq

  Asp.net mvc 低效的MVC ViewModel对数据库进行多次调用?,asp.net-mvc,linq,viewmodel,Asp.net Mvc,Linq,Viewmodel,我
  Asp.net mvc 低效的MVC ViewModel对数据库进行多次调用?
 
  asp.net-mvclinq
 
  Asp.net mvc 低效的MVC ViewModel对数据库进行多次调用?,asp.net-mvc,linq,viewmodel,Asp.net Mvc,Linq,Viewmodel,我显然不知道我在做什么。这个MVC的东西真的让我为保持这种模式而兴奋不已。我一直在关注MVC教程和超级谷歌,这是我自己画的一个角落我有多个相似的数据块,我正试图获得一个视图。我可以让我的代码正常工作,但在我看来,由于对数据库的多次调用,我们开始从数据库中提取大型记录集,这将是非常低效的。因此,我有一个OrderSummary类,类内是:public IEnumerable GetOrders(){ var orders = (from s in db.Ord
 
  我显然不知道我在做什么。这个MVC的东西真的让我为保持这种模式而兴奋不已。我一直在关注MVC教程和超级谷歌,这是我自己画的一个角落
 
  我有多个相似的数据块,我正试图获得一个视图。我可以让我的代码正常工作,但在我看来,由于对数据库的多次调用,我们开始从数据库中提取大型记录集,这将是非常低效的。因此,我有一个OrderSummary类,类内是:
 
  public IEnumerable GetOrders()
  {
     var orders = (from s in db.Orders
                   where s.UserId == uId
                   select s);
     return orders.ToList();
  }
  所以,如果我们把最后一段代码复制给totalcommission和netprofittotal,基本上我就是这样安排的。我猜是给db打了四个电话
 
  然后在控制器中:
 
          var ordersummary = new OrdersSummary();
          var viewModel = new OrderSummary
          {
              Orders = ordersummary.GetOrders(),
              GrossProfitTotal = ordersummary.GetGrossProfitTotal(),
              CommissionTotal = ordersummary.GetCommissionTotal(),
              NetProfitTotal = ordersummary.GetNetProfitTotal(),
          };
          return View(viewModel);
  这将获得视图中所需的所有数据,以便我可以使用它。对我来说,这似乎是不必要的冗余,我猜是低效的?如果你再加上我也在做排序和搜索parms,那么它也有很多重复的linq代码。似乎我应该能够做一些事情来整合数据,如下所示:
 
     var orders = (from s in db.Orders
                   where s.UserId == uId
                   select s).ToList();
     decimal grossprofittotal = orders.Sum(s => s.Profit);
     decimal commissiontotal = orders.Sum(s => s.Commission);
     decimal netprofittotal = orders.Sum(s => s.Profit + s.Commission);
  然后将这四条数据(订单列表和三个十进制值)很好地包装成一个数组(或其他任何形式),并将它们发送给控制器/视图。在视图中,我需要能够循环浏览订单列表。我离这儿远吗?或者,MVC的标准程序是什么?谢谢。
 
  是的,四次获取相同的数据确实效率低下,而且完全没有必要。您可以很好地只提取一次,然后对您拥有的数据执行其他操作
 
  如果愿意,您可以保持
 
  GetOrders
  方法的原样,但这就是您需要获取的所有数据。是否在控制器或模型构造函数中获取数据主要取决于您的喜好。就我个人而言,我倾向于在模型中加入比控制器更多的逻辑
 
  只要使用
 
  ToList
  确保实际获取数据(或将结果实现为集合的任何其他方法),就可以根据内存中的数据计算总和。(如果没有它,您仍然需要对数据库进行四次查询。)
 
  您不必将所有项目的利润和佣金相加,即可从其他金额中计算出净利润总额:
 
  decimal netprofittotal = grossprofittotal + netprofittotal;
  LinqToEntities将所有查询转换为SQL。如果不想进行多个事务,可以通过
 
  .ToList()
  将结果提取到变量中,查询此对象并通过内存中的linqToObject进行计算
 
  向后:它首先从数据库获取所有订单
 
   var ordersInMemory = orders.ToList();
   decimal grossprofittotal = ordersInMemory.Sum(s => s.Profit);
   decimal commissiontotal = ordersInMemory.Sum(s => s.Commission);
   decimal netprofittotal = grossprofittotal + commissiontotal ;
  AsEnumerable
  方法仅将引用作为
 
  IEnumerable
  返回,它不会强制查询,因此代码仍将执行三次数据库调用,而不是一次。是的,返回,但在这种情况下,对象使用方法的默认实现,并切换到进程内模式。我是不是误解了什么?这也证明了我的谓词:当您在同一语句中继续查询时,它适用于单个查询。下一个方法将从服务器中提取结果。在本例中,下一个方法是
 
  Sum
  调用,因此每个调用都将从数据库中提取一个新结果。好的,我做了一些修改,这种方法怎么样?我在看,你也是这么建议的。ToArray()也可以。谢谢,这很有道理,听起来我需要回到基本原理上来,而不是把MVC看作一种全新的僵化的做事方式。不幸的是asp数据库,我的基本面参差不齐,但我现在至少可以跳出框框,大致知道在哪里可以找到答案。我真的很感谢你的帮助。
 
   var ordersInMemory = orders.ToList();
   decimal grossprofittotal = ordersInMemory.Sum(s => s.Profit);
   decimal commissiontotal = ordersInMemory.Sum(s => s.Commission);
   decimal netprofittotal = grossprofittotal + commissiontotal ;
 

(编辑:云计算网_汕头站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!