2017-01-26 18 views
2

私はタイプ別に登録することができるヘルパーをまとめました。私は登録複数を動的に追加する

Dictionary<Type, LambdaExpression[]> includes = 
    new Dictionary<Type, LambdaExpression[]>(); 

は次のように含まれています:このようになります

public void Add<T>(params Expression<Func<T, object>>[] includes) 
{ 
    this.includes.Add(typeof(T), includes); 
} 

Add<Customer>(e => 
    e.Address.City.Province.Country, 
    e.Products.Select(p => p.Category)); 

お知らせ2はCustomerのために含まれてあります。私は、取得するこの方法は、タイプによって含まれてい:

私のエンティティを取得するとき
DbSet<T> entitySet = null; 

void LoadIncludes() 
{ 
    var includes = Includes.Instance.Get<T>().DirectCast<Expression<Func<T, object>>[]>(); 

    if (includes != null) 
    { 
     foreach (var include in includes) 
     { 
      entitySet.Include(include).Load(); 
     } 
    } 
} 

、私はこれを行う:

public T GetById(int id) 
{ 
    LoadIncludes(); 

    return entitySet.SingleOrDefault(x => x.Id == id); 
} 

それはうまく動作しますが、それはとても遅いだし、それが原因で.Load()方法です私はLoadIncludes()に電話しています。私がここでやりたいことをより速く行う方法はありますか?

+0

を私は 'を呼び出すために、実行時に型固有のデリゲートをコンパイル/作成する表現を使用することができますね。コレクションのインクルードごとに連続してインクルード()します。私はそれを行い、誰もより良い解決策を持っていなければコードを投稿します。 – oscilatingcretin

+0

'entitySet'とは何ですか? –

+0

@IvanStoevおっと...それは 'DbSet 'です。更新されます – oscilatingcretin

答えて

2

Loadには電話をかけないでください。Queryable<T>Includeのチェーンを作成して使用しないでください。

は、専用の機能でLoadIncludesを置き換えます

private IQueryable<T> GetEntitySet() 
{ 
    var set = entitySet.AsQueryable(); 
    var includes = Includes.Instance.Get<T>().DirectCast<Expression<Func<T, object>>[]>(); 
    if (includes != null) 
    { 
     foreach (var include in includes) 
     { 
      set = set.Include(include); 
     } 
    } 
    return set; 
} 

と、次のようにそれを使用する:

public T GetById(int id) 
{ 
    return GetEntitySet().SingleOrDefault(x => x.Id == id); 
} 
+0

すごい!それは急速に燃えている。私はあなたがEFや表現木に何度か助けてくれたと思うので、もう一度感謝します。 – oscilatingcretin

+1

あなたは歓迎相手です:)それが私たちがここにいる理由です。 –

関連する問題