EF的通用任务方法

时间:2013-11-29 10:09:52

标签: c# asp.net entity-framework

我想创建一个启动新任务的通用方法>创建我的db上下文的唯一实例(因为EF dbcontext不是线程安全的,我想并行执行多个tak)>通过ToList()枚举结果:

这是我的伪代码,很可能无法编译。我需要你帮助改进它的正确语法:

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();
        }
    });
}

-

Func<SYSTEM, bool> func = x => x.SYSTEM_KEY == 123;
var task = DoGenericStuff(DbContext, func);

1 个答案:

答案 0 :(得分: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);
        }
    });
}

执行使用:

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

该函数接受一个具有DbContext的单个参数的委托,并且可以返回任意值。 DbContext的类型在函数调用的泛型参数中指定。如果你想.ToList()结果,那么在lambda中做。代码(根据您的伪代码)要求DbContext具有无参数构造函数。