0

この質問は、私の他の質問のパート B です。

データベースに複数の呼び出しを行う非効率的な MVC ViewModel?

データベースへの複数の呼び出しが悪い考えであることはわかっていました。しかし、私の本当の質問は、コードの最後のチャンクまたは speti43 の例を使用して、モデル コンストラクターで次のように言って、複数の db 呼び出しを排除することだと思います。

    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);

もう 1 つの問題は、ビュー モデルで正しいプロパティを構築しているかどうか完全に確信が持てないことです。現在、4 つのデータと 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);

2 番目の方法:

ビューモデル:

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);

表示 (1 番目と 2 番目の方法の場合):

@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 に答える