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-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 ; (编辑:云计算网_汕头站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐


浙公网安备 33038102330478号