实体框架 .NET Core 2.0 查询在执行子查询时挂起

Posted

技术标签:

【中文标题】实体框架 .NET Core 2.0 查询在执行子查询时挂起【英文标题】:Entity Framework .NET Core 2.0 Query hangs on execution when subquery is executed 【发布时间】:2018-01-30 00:07:16 【问题描述】:

使用常规版本的 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 驱动的应用程序中执行相同的代码时,我的应用程序只是冻结并且永远不会返回结果。

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

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

另一个子查询变体(也在执行中挂起):

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.
     

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

【问题讨论】:

见github.com/aspnet/EntityFrameworkCore/issues/9128 【参考方案1】:

我不确定。但是,你可以试试'.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();

【讨论】:

使用ToListAsync的重点是可以在async方法中使用。

以上是关于实体框架 .NET Core 2.0 查询在执行子查询时挂起的主要内容,如果未能解决你的问题,请参考以下文章

使用 .NET Core 进行分组的 Linq 查询

查询Core Data中多个子实体类型的所有对象

无论如何在 .NET Core 中使用实体框架?

如何在 OnSignedIn .net Core - 实体框架中访问数据库数据

ASP.NET MVC Core 和实体框架中的 ToListAsync 不起作用

.Net Core 2.0 appsettings 与 .net 完整框架使用 ConfigurationManager