2017-01-26 3 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)); 

Примечания Есть два включает в 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

Я предполагаю, что я мог бы использовать выражения для создания/компиляции делегата типоспецифической во время выполнения для вызова '. Include() 'последовательно для каждого include в коллекции. Я сделаю это и отправлю код, если у вас нет лучшего решения. – 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

Приветствую вас, товарищ :) Вот почему мы здесь. –

Смежные вопросы