2013-11-29 3 views
0

Я хотел бы создать универсальный метод, который запускает новую задачу> создает уникальный экземпляр моего контекста db (поскольку EF dbcontext не является потокобезопасным, и я хочу параллельно выполнять несколько таксов)> перечислите результат на ToList(): ing.Метод общей задачи для EF

Вот мой psuedo-код, который obviusly не будет компилировать. Мне нужна ваша помощь, совершенствуя его на правильный синтаксис:

private Task<T> DoGenericStuff<T>(T dbContext, Func<T, bool> func) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     using (var context = Activator.CreateInstance(dbContext.GetType())) 
     { 
      return context.func.ToList(); 
     } 
    }); 
} 

-

ответ

1
private Task<TResult> DoGenericStuff<TDbContext, TResult>(Func<TDbContext, TResult> func) where TDbContext : DbContext, new() 
{ 
    return Task.Factory.StartNew(() => 
    { 
     using (var context = new TDbContext()) 
     { 
      return func(context); 
     } 
    }); 
} 

Execute с помощью:

var task = DoGenericStuff<MyDbContext, bool>(context => context.Set<MyEntity>().Any()); 

Функция принимает делегата с одним аргументом от DbContext и может возвращать произвольные значения. Тип DbContext указан в общих аргументах вызова функции. Если вы хотите получить .ToList(), тогда сделайте это в лямбда. Код (в соответствии с вашим псевдокодом) требует, чтобы DbContext имел конструктор без параметров.

+0

Отлично, спасибо – Johan

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