微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

使用常规版本的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.
     }
}

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

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐