1

アプリケーションに製品と対応するカテゴリの詳細を表示するビューがあります。表示する必要がある製品とカテゴリ情報の両方を取得するために、ビューモデルから継承しています。

public ViewResult Index(string id, int page = 1, int pagesize = 10)
    {
        var viewModel = new PagedProductList()
        {
            CurrentPageIndex = page,
            PageSize = pagesize
        };

        viewModel.category = db.Category.First(c => c.Id == id);

        viewModel.products = db.Product
            .Where(i => i.Category.Id == viewModel.category.Id)
            .OrderBy(i => i.Id)
            .Skip((viewModel.CurrentPageIndex - 1) * viewModel.PageSize)
            .Take(viewModel.PageSize)
            .Include(p => p.ProductAttributeValues);

        return View(viewModel);
    }

ご覧のとおり、ビューモデルのカテゴリ ID をビューモデルの products where 句に渡しています。

質問 1:製品コードを別の子アクションに移動し、Html.Action を使用して親ビューからカテゴリ モデル ID を渡して親ビューからアクションを呼び出した場合、パフォーマンスやその他の点でこれがうまくいくでしょうか。

質問 2:カテゴリ情報と対応する製品の両方を取得するための他の良い方法はありますか? 商品のページングができないため、db.Category.Include(“Products”) のようなものは使用できません。

4

1 に答える 1

1

質問 1: いいえ。遅くなります。アクションの呼び出し (つまり、コントローラーの検索と設定) に関連するオーバーヘッドがあります。最終結果は、依然として 2 つのクエリを発行することになります。

質問 2: プロジェクションを使用して、単一のクエリで必要なもの (並べ替えとページングを使用したカテゴリの製品のナビゲーション) を取得できます。

var data = db.Category
             .Select(c => new 
             {  
                c, 
                Products = c.Products
                            .OrderBy(p => p.Id)
                            .Skip((viewModel.CurrentPageIndex - 1) * viewModel.PageSize)
                            .Take(viewModel.PageSize)
                            .Select(p => new { p, p.ProductAttributeValues })
            })
            .Single(c => c.Id == viewModel.category.Id);
viewModel.category = data.c;
viewModel.products = data.c.Products.Select(p => p.p).ToList();

これは、2 つの別個のクエリを作成するよりもパフォーマンスが若干向上する可能性がありますが、違いに気付くことはほとんどありません。

ただし、このコードの読みやすさの低下に対して、わずかに優れたパフォーマンスの利点を比較検討する必要があります。実際のパフォーマンスの問題がない場合 (おそらく問題ないと思います)、ここでパフォーマンスを最適化するのに時間を無駄にしていることになります。最適化する前に、実際に測定可能なパフォーマンスの問題が発生するまで待つ必要があります。より複雑なコードを使用することでパフォーマンスが大幅に向上しない限り、常に読みやすさを優先する必要があります。

注: より複雑なクエリに同様のパターンを使用すると、必要なデータだけを取得するために 2 つ以上のクエリを発行するよりも実際には遅くなる場合があります。

于 2013-01-23T20:15:40.087 に答える