c# - Entity Framework .NET Core 2.0 查询在执行子查询时挂起

标签 c# sql entity-framework entity-framework-6 entity-framework-core

使用常规版本的 EF 6.x,我可以使用以下查询非常轻松地执行子查询:

var q = from u in db.User
        let actions = from ua in db.UserActions
                      where ua.UserId == u.Id && ua.Approved
                      select ua
        where u.Active
        select new { User = u, Actions = actions.ToList() }

var result = await q.ToListAsync()

当我尝试在我的 ASP.NET Core 2.0 EntityFramework 驱动的应用程序中执行相同的代码时,我的应用程序只是卡住并且永远不会返回结果。

我尝试了一些变体,但一旦子查询作为初始查询的一部分执行后,所有变体都会挂起:

  1. 子查询(与上面相同,有一些变化)
  2. 左外连接

另一个子查询变体(也卡在执行上):

var q = from u in db.User
        let actions = (from ua in db.UserActions
                      where ua.UserId == u.Id && ua.Approved
                      select ua).ToList()
        where u.Active
        select new { User = u, Actions = actions }

另一个子查询变体(也卡在执行上):

var q = from u in db.User
        let actions = db.UserActions.Where(ua => ua.UserId == u.Id && ua.Approved)
        where u.Active
        select new { User = u, Actions = actions.ToList() }

左外连接的另一种变体(执行时也会挂起):

var forUserId = "test";
var q = from u in db.User
        join ua in db.UserActions on u.Id equals ua.UserId into actions
        from ua in action.DefaultIfEmpty()
        where u.Active
        select new { User = u, Actions = ua}

下面的代码有效,但很明显,子查询的执行被推迟了,一旦我们尝试访问 Action 属性,它就会启动另一个查询:

var q = from u in db.User
        let actions = from ua in db.UserActions
                      where ua.UserId == u.Id && ua.Approved
                      select ua
        where u.Active
        select new { User = u, Actions = actions }

var result = await q.ToListAsync()
foreach (var r in result)
{
     foreach(var a in r.Actions)
     {
          // extra database requests is executed for each result row
          // .. process action.
     }
}

如何执行子查询并获取实体列表,其中每个实体分配子实体列表,使用子查询接收?

最佳答案

我不确定。但是,您可以尝试“.ToList()”。

 var q = (from u in db.User
            join ua in db.UserActions on u.Id equals ua.UserId into actions
            from ua in action.DefaultIfEmpty()
            where u.Active
            select new {u,ua}).ToList();

关于c# - Entity Framework .NET Core 2.0 查询在执行子查询时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45805182/

相关文章:

entity-framework - 如何将PowerShell版本从2.0升级到3.0?

entity-framework - 如何在 ServiceStack Core 中注册 DbContext EF Core?

c# - 如何获取点击的位置?

c# - 无法转换属性的范围键值

c# - 将专有名称转换为规范名称

Java ResultSet 与 postgresql 一起工作

mysql - ASPNet 下拉列表从 0 到可用数量

sql - MSSQL 中的 INSERT 触发器 : destination table by Variable

asp.net-mvc - 如何在 Entity Framework 代码优先中以编程方式更新数据库?

c# - 使代码中的大数字可读