4

Article大量の列があり、データベースに100,000を超える行が含まれているモデルがあるとします。var articles = db.Articles.ToList()データベース内の各記事の記事モデル全体を取得してメモリに保持するようなことをするとしたらどうでしょうか。

したがって、エントリの日付とそのタイトルのみを表示するテーブルにデータを入力する場合、エンティティフレームワークを使用してデータベースからこれらの列のみを取得する方法はありますか?より効率的ですか?

これによると、

オブジェクトコンテキストで返されたオブジェクトを追跡するには、コストがかかります。オブジェクトへの変更を検出し、同じ論理エンティティに対する複数のリクエストが同じオブジェクトインスタンスを返すようにするには、オブジェクトをObjectContextインスタンスにアタッチする必要があります。オブジェクトを更新または削除する予定がなく、ID管理を必要としない場合は、クエリを実行するときにNoTrackingマージオプションの使用を検討してください。

NoTrackingデータは変更または削除されておらず、表示されているだけなので、使用する必要があるようです。したがって、私のクエリはになりvar articles = db.Articles.AsNoTracking().ToList()ます。これをより効率的にするために私がすべき他のことはありますか?

私が持っているもう1つの質問は、この回答によると、大規模なデータベースを処理する場合、を使用.Contains(...)するとパフォーマンスが大幅に低下するということです。大規模なデータベースのエントリを検索するために使用する推奨される方法は何ですか?

4

1 に答える 1

4

これはプロジェクションSELECT column1, column2, ...と呼ばれ、SQLでは次のように変換されます。

var result = db.Articles
    .Select(a => new
    {
        Date = a.Date,
        Title = a.Title
    })
    .ToList();

(「匿名」オブジェクトのリストを作成する)の代わりにa => new { ... }、名前付きヘルパークラス(または「ビューモデル」)を使用することもできます。これには、選択したプロパティのみが含まれます(ただし、エンティティ自体としてa => new MyViewModel { ... }使用することはできません)。a => new Article { ... }

投影されたデータはとにかく追跡されないため、このような投影の場合は必要ありませんAsNoTracking()。完全なエンティティオブジェクトのみが追跡されます。

Containsより一般的な方法を使用する代わりに、次のWhereように使用します。

var date = DateTime.Now.AddYears(-1);
var result = db.Articles
    .Where(a => date <= a.Date)
    .Select(a => new
    {
        Date = a.Date,
        Title = a.Title
    })
    .ToList();

これにより、1年以内の記事のみが選択されます。はWhereSQLステートメントに変換さWHEREれ、データベースでフィルターが実行されます(テーブルのサイズや適切なインデックス付けなどに応じて、SQLクエリと同じくらい高速です)。このフィルターの結果のみがメモリーにロードされます。

編集

以下のコメントを参照してください。

IEnumerable<T>.Contains(T t)と混同しないでくださいstring.Contains(string subString)。あなたがあなたの質問でリンクした答えは、の最初のバージョンについて話しますContains。テキスト本文に文字列が含まれる記事を検索する場合は、2番目のバージョン"keyword"が必要です。Contains

string keyword = "Entity Framework";
var result = db.Articles
    .Where(a => a.Body.Contains(keyword))
    .Select(a => new
    {
        Date = a.Date,
        Title = a.Title
    })
    .ToList();

WHERE Body like N'%Entity Framework%'これは、SQLのようなものに変換されます。のパフォーマンスの低下に関する答えは、Containsこのバージョンにはまったく当てはまりませんContains

于 2012-07-21T12:17:50.147 に答える