Я собрал некоторые помощники, которые позволят мне регистрировать по типу. Похоже, это:Добавить несколько включенных динамически
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()
. Есть ли более быстрый способ сделать то, что я хочу здесь сделать?
Я предполагаю, что я мог бы использовать выражения для создания/компиляции делегата типоспецифической во время выполнения для вызова '. Include() 'последовательно для каждого include в коллекции. Я сделаю это и отправлю код, если у вас нет лучшего решения. – oscilatingcretin
Что такое 'entitySet'? –
@IvanStoev Упс ... это 'DbSet'. Будет обновлено –
oscilatingcretin