来自两个 IQueryable 的 EF Core Join 抛出 System.ArgumentNullException

EF Core Join from two IQueryables throws System.ArgumentNullException

尝试使用来自两个数据集的 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:值不能为空。 参数名称:entityType Microsoft.EntityFrameworkCore.Utilities.Check.NotNull(T值,字符串参数名)

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

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

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