首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF 6-如何正确执行并行查询

EF 6-如何正确执行并行查询
EN

Stack Overflow用户
提问于 2017-01-19 19:15:37
回答 3查看 28.1K关注 0票数 25

在创建报表时,我必须执行涉及相同上下文的分离实体的3个查询。因为它们很重,所以我决定使用.ToListAsync();让它们并行运行,但是,令我惊讶的是,我得到了一个例外.

使用EF 6并行执行查询的正确方法是什么?我应该手动启动新任务吗?

编辑1

代码基本上是

代码语言:javascript
复制
using(var MyCtx = new MyCtx())
{
      var r1 = MyCtx.E1.Where(bla bla bla).ToListAsync();
      var r2 = MyCtx.E2.Where(ble ble ble).ToListAsync();
      var r3 = MyCtx.E3.Where(ble ble ble).ToListAsync();
      Task.WhenAll(r1,r2,r3);
      DoSomething(r1.Result, r2.Result, r3.Result);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-20 09:23:39

问题是:

EF不支持通过同一个DbContext对象处理多个请求。如果您在同一个DbContext实例上的第二个异步请求在第一个请求完成之前启动(这就是重点),您将得到一个错误消息,您的请求正在针对打开的DataReader进行处理。

来源:https://visualstudiomagazine.com/articles/2014/04/01/async-processing.aspx

您需要修改代码如下所示:

代码语言:javascript
复制
async Task<List<E1Entity>> GetE1Data()
{
    using(var MyCtx = new MyCtx())
    {
         return await MyCtx.E1.Where(bla bla bla).ToListAsync();
    }
}

async Task<List<E2Entity>> GetE2Data()
{
    using(var MyCtx = new MyCtx())
    {
         return await MyCtx.E2.Where(bla bla bla).ToListAsync();
    }
}

async Task DoSomething()
{
    var t1 = GetE1Data();
    var t2 = GetE2Data();
    await Task.WhenAll(t1,t2);
    DoSomething(t1.Result, t2.Result);
}
票数 36
EN

Stack Overflow用户

发布于 2022-03-10 17:22:33

令人感兴趣的是,当将EF与Oracle一起使用时,使用单个DB上下文的多个并行操作(这里的post )没有问题(尽管Microsoft的文档)。限制在Microsoft.EntityFrameworkCore.SqlServer.dll驱动程序中,而不是一个通用的EF问题。相应的Oracle.EntityFrameworkCore.dll驱动程序没有这个限制。

票数 5
EN

Stack Overflow用户

发布于 2019-10-19 09:46:36

查看https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/enabling-multiple-active-result-sets

从文件中:

允许SELECT和BULK INSERT语句的语句交织。但是,数据操作语言(DML)和数据定义语言(DDL)语句是原子执行的。

然后,您的上述代码工作,您将获得读取数据的性能好处。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41749896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档