0

自分が何をしているのかはっきりとわかりません。この MVC のものは、パターンを維持しようとしている私の心を本当に吹き飛ばしています。私はMVCのチュートリアルとメガグーグルをフォローしてきましたが、これは私が自分自身を描いたコーナーです。

ビューにアクセスしようとしている類似のデータが複数あります。コードを動作させることはできますが、db への複数の呼び出しが原因で db から大きなレコードセットをプルし始めると、非常に非効率になるように見えます。だから、私は 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;
}

したがって、コードの最後のチャンクを取り、それを totalcommission と netprofittotal にコピーすると、基本的にはこのようにレイアウトされます。私はデータベースへの4つの呼び出しを推測しますか?

次に、コントローラーで:

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

次に、これら 4 つのデータ (注文リストと 3 つの 10 進数値) を配列 (またはその他のもの) に適切にまとめて、コントローラー/ビューに送信します。ビューでは、注文リストをループできる必要があります。私はここから離れていますか?または、ここでの MVC の標準的な手順は何ですか? ありがとう。

4

2 に答える 2

1

はい、同じデータを 4 回フェッチすることは、実際には非効率的であり、完全に不必要です。一度だけフェッチしてから、所有しているデータに対して他の操作を実行できます。

必要に応じてメソッドをそのままにしておくこともできGetOrdersますが、取得する必要があるデータはそれだけです。コントローラーまたはモデル コンストラクターでデータを取得するかどうかは、ほとんど好みの問題です。個人的には、コントローラーよりもモデルに多くのロジックを配置する傾向があります。

実際にデータをフェッチすることを確認するために使用する限りToList(または結果をコレクションとして実現する他の方法)、メモリにあるものから合計を計算できます。(それがなければ、データベースに対して 4 つのクエリを実行することになります。)

すべてのアイテムの利益と手数料を合計して純利益の合計を得る代わりに、他の合計から計算することができます。

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

LinqToEntities はすべてのクエリを SQL に変換します。複数のトランザクションを作成したくない場合は、.ToList()このオブジェクトをクエリしてメモリ内の linqToObject で計算を行うことにより、結果を変数にフェッチできます。

Backward: 最初にデータベースからすべての注文を取得します。

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