【问题标题】:EF Core Join from two IQueryables throws System.ArgumentNullException来自两个 IQueryable 的 EF Core Join 抛出 System.ArgumentNullException
【发布时间】:2018-12-20 12:17:58
【问题描述】:

尝试使用来自两个数据集的 ef 核心加入时出现 System.ArgumentNullException。

我正在使用 asp.netcore 的内置身份功能,我有两个上下文:MyDbContext 和 IdentityDbContext。我在 MyDbContext 中有一个 User 实体,它拥有一个 IdentityGuid,所以我可以知道哪个用户与哪个 IdentityUser 相关联。

我想做一个 Join 并获得一个 KeyValuePair 并将其作为 ViewModel 提供。

        var users = _context.Users;
        var identityUsers = _identityContext.Users;

        var selection = users.Join(identityUsers,
            u => u.IdentityGuid,
            iu => iu.Id,
            (u, iu) => new KeyValuePair<User, IdentityUser>(u, iu));

        return View(await selection.ToListAsync());

执行 Join 会引发 System.ArgumentNullException,但是如果我在 Join 之前对两个数据集执行 ToList(),那么它就可以正常工作。这是例外:

ArgumentNullException:值不能为空。 参数名称:实体类型 Microsoft.EntityFrameworkCore.Utilities.Check.NotNull(T value, string parameterName)

【问题讨论】:

  • 我不确定 EF Core 是否可以在两个数据库上下文中同时执行延迟执行(这正是您尝试使用此代码执行的操作)。但是,当ToList() 出现时,它会导致两个查询彼此独立地执行,所以它照常工作。

标签: c# linq asp.net-core entity-framework-core ef-core-2.1


【解决方案1】:

正如 Miamy 在他的评论中提到的,EF Core 不支持跨上下文延迟执行连接。其中一个(或两者)将需要调用 .ToList() 以使它们都被评估并拉入本地内存以进行连接。

这在理论上也可以通过手动编写连接 sql 并使用 EF 执行(因为这将允许交叉连接)来完成,但通常解决方案应该是使用 .ToList() 将数据拉入本地,然后加入。

不幸的是,像这样的交叉连接不受支持,尽管我也不相信它们在 NHibernate 中,所以它对我的知识有全面的限制

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2021-09-29
    相关资源
    最近更新 更多