Entity framework 使用任务抛出的EF调用在创建模型或基础提供程序在打开时失败时无法使用上下文

Entity framework 使用任务抛出的EF调用在创建模型或基础提供程序在打开时失败时无法使用上下文,entity-framework,task-parallel-library,Entity Framework,Task Parallel Library,我试图通过在.NET4.0中使用任务类调用大union子句EF查询来提高其性能。但是有时Task.WaitAll()抛出的错误可能是在创建模型时无法使用上下文,或者它表示基础提供程序无法打开 现有EF查询 //Fetches non saved transaction //var edlTransactions = (from edlTran in _context.MarketTransactions.OfType<EDLTransaction>()

我试图通过在.NET4.0中使用任务类调用大union子句EF查询来提高其性能。但是有时Task.WaitAll()抛出的错误可能是在创建模型时无法使用上下文,或者它表示基础提供程序无法打开

现有EF查询

//Fetches non saved transaction
        //var edlTransactions = (from edlTran in _context.MarketTransactions.OfType<EDLTransaction>()
        //                       where edlTran.MarketData.Any(m => m.ProfilePoints.Any(p => p.Status != (int)MarketDataState.New && assetProfileIds.Contains(p.AssetProfileID)))
        //                                                select edlTran).OrderByDescending(o => o.LogTime).Take(rowCount);


        //var dataEntryTransactions = (from daTran in _context.MarketTransactions.OfType<EDLDataEntry>()
        //                             where daTran.MarketData.Any(m => m.ProfilePoints.Any(p => p.Status != (int)MarketDataState.New && assetProfileIds.Contains(p.AssetProfileID)))
        //                                                    select daTran).OrderByDescending(o => o.LogTime).Take(rowCount);


        //var nonSavedTransactions = edlTransactions.Cast<MarketTransaction>().Union(dataEntryTransactions).OrderByDescending(o => o.LogTime).Take(rowCount);

        //var utcDateTime = DateTime.Now.ToUniversalTime();

        ////Fetches saved transactions
        //var edlSavedTransactions = (from edlTran in _context.MarketTransactions.OfType<EDLTransaction>()
        //                            where edlTran.MarketData.Any(m => m.ProfilePoints.Any(p => p.PointTime >= utcDateTime && p.Status == (int)MarketDataState.New && assetProfileIds.Contains(p.AssetProfileID))) && edlTran.AccountId == userId
        //                                               select edlTran);

        ////finally merging non saved status & saved status transactions
        //return nonSavedTransactions.Cast<MarketTransaction>().Union(edlSavedTransactions).ToList().AsQueryable();
//获取未保存的事务
//var edlTransactions=(来自_context.MarketTransactions.OfType()中的edlTran)
//其中edlTran.MarketData.Any(m=>m.ProfilePoints.Any(p=>p.Status!=(int)MarketDataState.New&&assetProfileIds.Contains(p.AssetProfileID)))
//选择edlTran.OrderByDescending(o=>o.LogTime).Take(rowCount);
//var dataEntryTransactions=(来自_context.MarketTransactions.OfType()中的daTran)
//其中daTran.MarketData.Any(m=>m.ProfilePoints.Any(p=>p.Status!=(int)MarketDataState.New和&assetProfileIds.Contains(p.AssetProfileID)))
//选择daTran.OrderByDescending(o=>o.LogTime).Take(rowCount);
//var nonSavedTransactions=edlTransactions.Cast().Union(dataEntryTransactions).OrderByDescending(o=>o.LogTime).Take(rowCount);
//var utcDateTime=DateTime.Now.ToUniversalTime();
////获取保存的事务
//var edlSavedTransactions=(来自_context.MarketTransactions.OfType()中的edlTran)
//其中edlTran.MarketData.Any(m=>m.ProfilePoints.Any(p=>p.PointTime>=utcDateTime&&p.Status==(int)MarketDataState.New&&AssetProfileID.Contains(p.AssetProfileID))&&edlTran.AccountId==userId
//选择edlTran);
////最后合并未保存状态和已保存状态事务
//返回nonSavedTransactions.Cast().Union(edlSavedTransactions.ToList().AsQueryable();
使用任务更新了查询

            var tasks = new Task[3];
        tasks[0] = Task.Factory.StartNew(() =>
        {
            edlTransactions = (from edlTran in _context.MarketTransactions.OfType<EDLTransaction>()
                where
                    edlTran.MarketData.Any(
                        m =>
                            m.ProfilePoints.Any(
                                p =>
                                    p.Status != (int) MarketDataState.New &&
                                    assetProfileIds.Contains(p.AssetProfileID)))
                select edlTran).OrderByDescending(o => o.LogTime).Take(rowCount).ToList();

        });

        tasks[1] = Task.Factory.StartNew(() =>
        {
            dataEntryTransactions = (from daTran in _context.MarketTransactions.OfType<EDLDataEntry>()
                where
                    daTran.MarketData.Any(
                        m =>
                            m.ProfilePoints.Any(
                                p =>
                                    p.Status != (int) MarketDataState.New &&
                                    assetProfileIds.Contains(p.AssetProfileID)))
                select daTran).OrderByDescending(o => o.LogTime).Take(rowCount).ToList();

        });

        tasks[2] = Task.Factory.StartNew(() =>
        {
            var utcDateTime = DateTime.Now.ToUniversalTime();

            //Fetches saved transactions
            edlSavedTransactions = (from edlTran in _context.MarketTransactions.OfType<EDLTransaction>()
                where
                    edlTran.MarketData.Any(
                        m =>
                            m.ProfilePoints.Any(
                                p =>
                                    p.PointTime >= utcDateTime && p.Status == (int) MarketDataState.New &&
                                    assetProfileIds.Contains(p.AssetProfileID))) && edlTran.AccountId == userId
                select edlTran).ToList();

        });

        Task.WaitAll(tasks);
var tasks=新任务[3];
任务[0]=Task.Factory.StartNew(()=>
{
edlTransactions=(来自_context.MarketTransactions.OfType()中的edlTran)
哪里
edlTran.MarketData.Any(
m=>
m、 点,有吗(
p=>
p、 状态!=(int)MarketDataState.New&&
AssetProfileID.Contains(p.AssetProfileID)))
选择edlTran.OrderByDescending(o=>o.LogTime).Take(rowCount.ToList();
});
tasks[1]=Task.Factory.StartNew(()=>
{
dataEntryTransactions=(来自_context.MarketTransactions.OfType()中的daTran)
哪里
daTran.MarketData.Any(
m=>
m、 点,有吗(
p=>
p、 状态!=(int)MarketDataState.New&&
AssetProfileID.Contains(p.AssetProfileID)))
选择daTran.OrderByDescending(o=>o.LogTime).Take(rowCount.ToList();
});
tasks[2]=Task.Factory.StartNew(()=>
{
var utcDateTime=DateTime.Now.ToUniversalTime();
//获取保存的事务
edlSavedTransactions=(来自_context.MarketTransactions.OfType()中的edlTran)
哪里
edlTran.MarketData.Any(
m=>
m、 点,有吗(
p=>
p、 PointTime>=utcDateTime&p.Status==(int)MarketDataState.New&&
assetProfileIds.Contains(p.AssetProfileID))&&edlTran.AccountId==userId
选择edlTran.ToList();
});
Task.WaitAll(任务);

您正在同时使用不受支持的相同数据上下文。为每个线程使用不同的上下文。

但这是一种开销,不是吗&这会降低性能,从而达不到目的?你不能做你现在正在做的事情。您永远不能同时使用上下文。;比较创建上下文和发出查询的开销。创建它几乎不需要任何成本。发出查询代价高昂。这应该可以回答您关于开销的问题。谢谢@usr。我可以像这样使用dataContext周围的块来使用一个查询:使用(var context=FrameworkEntities.GetDataContext()){edltTransactions=(来自context.MarketTransactions.OfType()中的edlTran,其中edlTran.MarketData.Any(m=>m.ProfilePoints.Any(p=>p.Status!=(int)MarketDataState.New&&assetProfileIds.Contains(p.AssetProfileID)))选择edlTran.OrderByDescending(o=>o.LogTime.Take(rowCount.ToList();}),这将是执行此操作的适当方法。不过,请确保edlTransactions不会在线程之间共享。