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

标签 c# .net sql-server entity-framework

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

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

编辑 1
代码基本上是

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

最佳答案

问题是这样的:

EF doesn't support processing multiple requests through the same DbContext object. If your second asynchronous request on the same DbContext instance starts before the first request finishes (and that's the whole point), you'll get an error message that your request is processing against an open DataReader.

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

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

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

关于c# - EF 6 - 如何正确执行并行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41749896/

相关文章:

sql - 修改SELECT语句的返回值(SQL)【优化查询】

c# - 通过 lambda 表达式传递属性名称以读取属性值

c# - PostAsync 后 HttpClient 401 未经授权(承载身份验证)

c# - Task.Wait 应该被弃用吗?

sql-server - 具有多个 JOINS 的复杂选择逻辑

java - MyBatis:java.sql.SQLException:传递给设置或更新方法的 java.sql.Types 常量值 -9 无效

c# - N点渐变画笔多边形填充

c# - 以编程方式创建 WPF 窗口

.net - 使用RavenDB查询子文档列表

c# - 我如何计算所有选定文件的总大小?