0

这个问题是我的另一个问题的 B 部分:

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

我知道多次调用数据库是个坏主意。但是,我想我真正的问题是如果我使用我的最后一段代码或 speti43 的示例让我们在我的模型构造函数中这样说来消除多个数据库调用:

    Public Class OrdersSummary{
    ...
      Public ???? GetOrders(){

        var ordersInMemory = orders.ToList();
        decimal? GrossProfitTotal = ordersInMemory.Sum(s => s.Profit);
        decimal? CommissionTotal = ordersInMemory.Sum(s => s.Commission);
        decimal? NetProfitTotal = GrossProfitTotal + CommissionTotal;
        return ?????

      }
    }

如何将这些单独但相似的数据传递给控制器​​?我试图根据其他一些 SO 文章推荐使用这样的元组:

如何从 C# (ASP.NET) 中的函数返回多个值?

public Tuple<IEnumerable<dynamic>, decimal?, decimal?, decimal?> GetOrders(string sortOrder, string searchString)
{
...

    return new Tuple<IEnumerable<dynamic>,decimal?,decimal?,decimal?> (ordersInMemory, GrossProfitTotal, CommissionTotal, NetProfitTotal);
}

这听起来合理吗?然后我不知道如何在我的控制器中引用元组:

        var ordersummary = new OrdersSummary();
        var viewModel = new OrderSummary
        {
            ???? cause I have no idea how to reference the tuple
        };
        return View(viewModel);

另一个问题是我不完全确定我在我的视图模型中构建了正确的属性。目前,对于四条数据,然后是 Orders 列表的各个属性,我有这样的情况:

public class OrderSummary
    {
        public IEnumerable<dynamic> Orders { get; set; }
        public decimal GrossProfitTotal { get; set; }
        public decimal CommissionTotal { get; set; }
        public decimal NetProfitTotal { get; set; }

        //Orders Table Properties
        public int OrderNumber { get; set; }
        public DateTime OpenTime { get; set; }
        //more properties here that correspond to the Orders table.
    }

似乎我可能需要在视图模型中构建不同的元组属性?如果是这样,什么语法?

如果我知道控制器中发生了什么,我想我可能知道视图中发生了什么。这甚至是正确的方法吗?我从 MVCMUsicStore 教程的第 8 步得到了整个视图模型结构的想法:

http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-8

4

1 回答 1

0

经过大量的诅咒和更多的红色波浪线之后,我想出了几种方法来做到这一点,而且都不涉及元组:

第一种方法:

视图模型:

public IEnumerable<OrderSummary> Orders { get; set; }
public decimal? GrossProfitTotal { get { return Orders.Sum(s => (decimal)s.Profit); } }
public decimal? CommissionTotal { get { return Orders.Sum(s => (decimal)s.Commission); } }
public decimal? NetProfitTotal { get { return GrossProfitTotal + CommissionTotal; } }

控制器:

var orderssummary = new OrdersSummary();
var viewModel = new OrderSummary
{
   Orders = orderssummary.GetOrders(sortOrder, searchString),
}

return View(viewModel);

第二种方法:

视图模型:

public IEnumerable<OrderSummary> Orders { get; set; }        
public decimal? GrossProfitTotal { get; set; }
public decimal? CommissionTotal { get; set; }
public decimal? NetProfitTotal { get; set; }

控制器:

    var orderssummary = new OrdersSummary();
    var orderslist = orderssummary.GetOrders(sortOrder, searchString);

    decimal? grossprofittotal = orderslist.Sum(s => (decimal)s.Profit);
    decimal? commissiontotal = orderslist.Sum(s => (decimal)s.Commission);
    decimal? netprofittotal = orderslist.Sum(s => (decimal)s.Profit + s.Commission);

        var viewModel = new OrderSummary
        {
            Orders = orderslist,
            GrossProfitTotal = grossprofittotal,
            CommissionTotal = commissiontotal,
            NetProfitTotal = netprofittotal,
        };

    return View(viewModel);

查看(对于第一种和第二种方法):

@foreach (var item in Model.Orders){
   @item.OrderNumber
   @item.OpenTime
   etc.
}
    @Model.CommissionTotal
    @Model.GrossProfitTotal
    @Model.NetProfitTotal

我目前使用的是 1 号,因为它看起来更干净一些。我相信它现在正在循环通过我的 Ienumerable 来获取其他值,而不是为每个值打分贝?我很想弄清楚如何在一个循环中计算所有值。

看起来我什至不需要数字 1 的视图模型,但我将向视图添加其他信息,如图表数据,所以我将保留我的选项。

我总是很想知道人们的想法,以及他们是否偏爱任何一种或一种更好的方法。

于 2013-07-04T11:56:32.547 回答