2

私はエンティティフレームワークでまだ新しいです。質問がダミーの場合はご容赦ください:)
データベースからいくつかのデータのリストを取得するドメインクラスがあります:

public IEnumerable<Item> GetItems()
        {
            return context.Items.ToList();
        }

このコードは、データベースからすべてのアイテムを返します。
このサイトではページングを使用しているため、1 ページに必要なアイテムは 10 個だけです。
だから私はこのようなことをしました:

var model = itemsRepository.GetItems().
                    Where(x => x.CategoryId == categoryId).
                    OrderByDescending(x => x.CreatedOnDate).
                    Skip(0).
                    Take(pageSize);

ここで行ったことがわかったので、db からすべての項目を取得し、それらをフィルター処理します。
ドメインに新しいメソッドを配置し、次のコードを配置すると、メリットが得られますか。

return context.Items.Where(x => x.CategoryId == categoryId).
                    OrderByDescending(x => x.CreatedOnDate).
                    Skip(0).
                    Take(pageSize);
4

4 に答える 4

1

コードにいくつかの問題があります。

  1. クラスで変数を使用しないでcontextください。必要になるたびに、変数を作成して破棄します(を使用して)。

    using(var context = new ...){//DBの処理を行う}

  2. を呼び出さないToList()でください。すべてのアイテムをフェッチするには、通常のページングを使用してからToListを呼び出します(2番目のサンプルのようなものですが、...を使用します)。

于 2012-08-30T21:00:15.040 に答える
1

2番目のアプローチの問題は、ドメインがコンテキストに結合されていることです。これにより、リポジトリパターンの主な目的の1つが無効になります。リポジトリ内に、取得したいページ番号を渡した2番目のメソッドがあり、それらが返されることをお勧めします。あなたのリポジトリには次のようなものがあります

public IEnumerable<Item> GetItemsForPage(int pageNumber)
    {
        return context.Items.Where(x => x.CategoryId == categoryId).
                OrderByDescending(x => x.CreatedOnDate).
                Skip(pageNumber * pageSize).  //Note not always 0
                Take(pageSize);

    }

ドメインでは、repository.GetItemsForPage()を呼び出します。これにより、ドメインとコンテキストの分離を維持しながら、実行を遅らせるという利点が得られます。

于 2012-08-30T21:00:38.703 に答える
1

はい、そうすべきです。コンテキストのバックエンドとして SQL を使用していると仮定していますが、新しいメソッドで作成されるクエリは、それらの 10 個のレコードのみを引き出してIEnumerable(遅延実行)として返します。データベースを検索し、最初の 10 件の結果を除外するだけです。

遅延実行を使用する 2 番目の (新しい) メソッドの方が適していると思います。

SQL プロファイラーによるパフォーマンスの向上も見られますか?

于 2012-08-30T20:55:43.947 に答える
1

はい。後者の場合、LINQ クエリが SQL に変換され、データベースで実行されるという利点があります。したがって、最初の例はテーブル全体をメモリにロードしますが、2 番目の例はデータベースでより効率的なクエリを実行します。

基本的に、ブレークは実行を延期しましたが、要件によっては、よりも.ToList()戻り、上位レイヤーで作業することも理にかなっている場合があります。また、この質問と回答を読んでみてください。IQueryable<T>IEnumerable<T>

于 2012-08-30T20:56:22.100 に答える