エンティティフレームワーク:特定のクエリの遅延読み込みを無効にする方法は?


88

Entity Framework 6で特定のクエリの遅延読み込みを無効にする方法はありますか?定期的に使用したいのですが、無効にしたい場合があります。仮想プロパティを使用して遅延読み込みしています。


20
set context.Configuration.LazyLoadingEnabled = false; 実行するクエリの前
Karthik Ganesan 2014年

5
this.Configuration.LazyLoadingEnabled = false;を設定してから、もう一度設定することができthis.Configuration.LazyLoadingEnabled = true;ますか?また、このmsdn.microsoft.com/en-us/data/jj574232.aspx
user1477388 2014年

1
ありがとう@KarthikGanesan。期待通りに動作しました。
マルコアルベス2014年

@KarthikGanesanあなたのコメントを答えとしていただけますか?それは本当にうまく機能しています:)
サンパス2016

1
回答としてコメントを追加@ Sampath–
Karthik Ganesan

回答:


76

実行するクエリの前に次のコードを設定します

context.Configuration.LazyLoadingEnabled = false;

40

次のように、特定のクエリの遅延読み込みを無効にできます。

public static Cursos GetDatosCursoById(int cursoId)
{
    using (var bd = new AcademyEntities())
    {
        try
        {
            bd.Configuration.ProxyCreationEnabled = false;
            return bd.Cursos.FirstOrDefault(c => c.cursoId == cursoId);
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}

20

ここで何かが足りないかもしれませんが、毎回構成を変更するのではなく、.Include()負荷をかけたいクエリにのみ使用するという別のアプローチがありますか?

我々が持っていると仮定Productにナビゲーションプロパティを持つクラスColourは、ロードかもしれませんが、クラスのColourためにProduct、このような-

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();

1
私にとって、これはここでの最良の答えです!
イアン

インクルードなしで「製品」を熱心にロードしたいだけの場合、これは不十分です。
マッカン2018

したがって、関連するオブジェクトを含まない「製品」、または関連するすべてのオブジェクトを含む「製品」を取得する必要がありますか?
パリーバード2018

1
はるかに有用な答え。これは、クエリが作成されているポイントでロードされる特定の従属テーブルを制御します。現実世界の問題については、これが進むべき道でなければなりません。
リチャードペテラム2018

5
これは別の方法で役立ちます...この方法で行うと、「Products」から別のコレクションの遅延読み込みを取得する可能性があります。実際に遅延読み込みを無効にすると、必要なすべてのデータが事前にフェッチされ、隠れたパフォーマンスのボトルネックが発生しないようにするために、より効果的です。
ダグ

15

ダイアグラムのプロパティに移動し、遅延読み込みに指定されているプロパティを見つけて無効にします。

最初にコードを使用している場合は、構成領域に移動し、そこから次のコマンドを使用して無効にします。

this.Configuration.LazyLoadingEnabled = false;

6
多くの人がこの質問にアクセスしています。言いたいのは、実行プランを見ずにクエリを作成しないことです。コードがデータベースに送信する内容を常に把握しておくと、パフォーマンスの問題が発生します。linq padまたはその他のツールを使用して、実際のクエリを表示して確認できます。
フアン


3

別のEFバージョンの別のアプローチ(Entity Framework 5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 

ときcontextObjectContext、そのラッパーの、多かれ少なかれ非推奨前身DbContext
Gert Arnold

2

あなたがこれを持っているとしましょう:

IOrderedQueryable<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite);
}

「しない」という明示的な設定にもかかわらず、遅延読み込みが発生します。修正は簡単です。次のように変更してください。

List<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    // context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite).ToList();
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.