2017-08-21 9 views
0

サブクラスを含むいるICollection構造のマテリアライズ。は、私はそれがパフォーマンスのベンチマークの間に際立っているので、EF 4日に書かれたいくつかのコードを見直してい

コードの目的は、Entity Frameworkの(私たちは、EF 6.1になりましたね)を使用してICollection<MyBaseClass>を実体化することです。実際のタイプが格納されたデータベースから

public Parent 
{ 
    public virtual ICollection<MyBaseClass>() Base { get; set; } 
} 

を取得するときに特定のサブクラス中に存在する参照が実体化されていないため、コードが存在

はMyBaseClassのサブクラスです。

例のサブクラス:ICollection<MyBaseClass>() Baseは、いくつかの具体的なサブクラスのミックスが含まれていることを

var parent = ctx.Parents.Include(p => p.Base).Where(...).Single(); 
LoadSubclasses(parent.Base); 
... 
private void LoadSubclasses(IEnumerable<MyBaseClass> myBase) 
{ 
    foreach (var my in myBase) 
    { 
     if (my is SubA) 
     { 
      this.Entry(my).Reference("Ref1").Load(); 
      this.Entry((SubA)my).Ref1).Collection("Options").Load(); 
     } 
     else... // Similar for other subclasses 
    } 
} 

注:

public SubA : MyBaseClass 
{ 
    public virtual ICollection<Options> Ref1 { get; set; } 
} 

現在、コードはこのような何かを行います。 ICollectionには一般に数百のオブジェクトがあります。

Baseを具現するためのより効率的な方法はありますか?

+0

あなたは[継承](HTTPSに関するいくつかのEFの記事をチェックしています。net/manavi/inheritance-mapping-strategies-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph)を使用していますか? –

答えて

3

性能が(時々、サブコレクションが実際にマイナスの影響を有することができる含む特にとともに、単一の複雑なクエリを実行する)良くなる場合は、事前に言うことができませんが、K、Kにデータベースクエリの数を最小限に抑えることができ追加のインクルードが必要なサブクラスタイプの数です。

あなたはすべての基本エンティティを表すIQueryable<TBase>LoadSubclasses方法をベースにし、OfTypeフィルタを使用して、各サブクラスの種類ごとにクエリを実行する必要があります。

private void LoadSubclasses(IQueryable<MyBaseClass> baseQuery) 
{ 
    // SubA 
    baseQuery.OfType<SubA>() 
     .Include(x => x.Ref1.Options) 
     .Load(); 
    // Similar for other subclasses 
} 

あなたのサンプルとの使用量は次のようになります。

var parent = ctx.Parents.Include(p => p.Base).Where(...).Single(); 
LoadSubclasses(ctx.Entry(parent).Collection(p => p.Base).Query()); 

以上:

var parentQuery = ctx.Parents.Where(...); 
var parents = parentQuery.Include(p => p.Base).ToList(); 
LoadSubclasses(parentQuery.SelectMany(p => p.Base)); 
+1

私の場合、このアプローチは140倍高速です。 –

0

EF Core 2.1以降の場合は、この機能is now supportedをそのまま使用できます。 2010年

要求:エンティティ・フレームワークのデータモデルのナビゲーションプロパティ を有する場合

は はOfType <を使用する場合以外に熱心な負荷そのナビゲーションプロパティにpossebleされていない>または場合熱心な由来をロードナビゲーションプロパティ で自分自身を入力します。

2018からの応答:

機能はプレビューで、現在あるEFコア2.1の一部です。 問題が見つかった場合は、問題追跡ツールで問題を作成してください。 //weblogs.asp:

関連する問題

 関連する問題