来自两个IQueryable的EF Core Join引发System.ArgumentNullException

时间:2018-12-20 12:17:59

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

尝试从两个数据集中与ef core联接时具有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:值不能为null。 参数名称:entityType Microsoft.EntityFrameworkCore.Utilities.Check.NotNull(T值,字符串parameterName)

1 个答案:

答案 0 :(得分:2)

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

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

不幸的是,像arent一样支持交叉连接,尽管我也不认为它们也包含在NHibernate中,所以这对我的知识来说是一个全面的局限性