0

我显然不知道我在做什么。这个 MVC 东西真的让我在试图保持这种模式时大吃一惊。我一直在关注 MVC 教程以及大型谷歌搜索,这是我自己画的一个角落。

我有多个类似的数据要查看。我能够让我的代码正常工作,但对我来说,由于对数据库的多次调用,我们开始从数据库中提取大型记录集,因此它看起来效率非常低。所以,我有一个 OrderSummary 类,类里面是这样的:

public IEnumerable<Order> GetOrders()
{
   var orders = (from s in db.Orders
                 where s.UserId == uId
                 select s);

   return orders.ToList();
}

然后这个:

public decimal GetGrossProfitTotal()
{
   var orders = (from s in db.Orders
                 where s.UserId == uId
                 select s);
   decimal? grossprofittotal = orders.Sum(s => s.Profit);

   return grossprofittotal ?? decimal.Zero;
}

所以,如果我们把最后一段代码复制到总佣金和净利润总额中,这基本上就是我的布局。我猜想对数据库有四个调用?

然后在控制器中:

        var ordersummary = new OrdersSummary();
        var viewModel = new OrderSummary
        {
            Orders = ordersummary.GetOrders(),
            GrossProfitTotal = ordersummary.GetGrossProfitTotal(),
            CommissionTotal = ordersummary.GetCommissionTotal(),
            NetProfitTotal = ordersummary.GetNetProfitTotal(),
        };
        return View(viewModel);

这让我在视图中获得了我需要的所有数据,以便我可以使用它。对我来说,这似乎是不必要的多余,我猜效率低下?如果你说我也在做排序和搜索参数,那也是很多重复的 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 的标准程序是什么?谢谢。

4

2 回答 2

1

是的,四次获取相同的数据确实效率低下,而且完全没有必要。您可以很好地只获取一次,然后对您拥有的数据执行其他操作。

如果您愿意,您可以保留该GetOrders方法,但这就是您需要获取的所有数据。如果您在控制器或模型构造函数中获取数据,则主要是个人喜好问题。就个人而言,我倾向于在模型中放置比控制器更多的逻辑。

只要您使用ToList确保实际获取数据(或将结果实现为集合的任何其他方法),您就可以根据内存中的内容计算总和。(没有它,您仍然需要对数据库进行四次查询。)

无需将所有项目的利润和佣金相加得到净利润总额,您可以从其他总和中计算出来:

decimal netprofittotal = grossprofittotal + netprofittotal;
于 2013-06-26T11:48:49.297 回答
1

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 ;
于 2013-06-26T11:59:06.420 回答