来自两个 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 中,所以据我所知这是一个全面的限制
尝试使用来自两个数据集的 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 中,所以据我所知这是一个全面的限制