无法翻译带有`groupjoin`的查询,尽管文档中将其记录为受支持 [英] Query with `groupjoin` cannot be translated although it's documened as being supported
本文介绍了无法翻译带有`groupjoin`的查询,尽管文档中将其记录为受支持的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我不明白为什么这个不能翻译。这似乎正是所描述的用例here。
LINQ表达式
DbSet<A>()
.GroupJoin(
inner: DbSet<B>(),
outerKeySelector: a => a.AId,
innerKeySelector: b => b.AId,
resultSelector: (a, bs) => new {
a = a,
bs = bs
})
产生错误:
无法翻译。以可以翻译的形式重写查询,或者通过插入对"AsEnumerable"、"AsAsyncEnumerable"、"ToList"或"ToListAsync"的调用显式切换到客户端评估。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038。
产生异常的LINQ代码为
from a in ctx.As
join b in ctx.Bs on a.aId equals b.aId into bs
select new {A = a, Bs = bs.ToList()};
编辑:可能是我误解了文档,这是无法翻译的示例。
执行类似以下示例的查询将生成blog&;IEnumerable结果。由于数据库(尤其是关系数据库)无法表示客户端对象的集合,因此GroupJoin在许多情况下不能转换为服务器。它要求您从服务器获取所有数据来执行GroupJoin,而不需要特殊的选择器(下面的第一个查询)。但是,如果选择器限制选择的数据,那么从服务器获取所有数据可能会导致性能问题(下面的第二个查询)。这就是EF Core不翻译GroupJoin的原因。
但我的问题变成了:如何在不要求导航属性的情况下实现所需结果?
推荐答案
链接文档中的解释只是遵循EF核心团队的愿景,很荒谬,因为它当然很容易翻译-我在这里与团队进行了很长时间的讨论Query with GroupBy or GroupJoin throws exception #17068,并在这里继续Query: Support GroupJoin when it is final query operator #19930,试图说服他们为什么应该支持它,不管争论如何,都没有运气。
整个要点是(这就是当前的解决办法),可以像关联子查询(SelectMany
)一样处理它,并正确转换和处理它(即使查询结果形状没有SQL等效项。
不管怎样,当前状态是";Need Design&Quot;(不管这意味着什么),解决办法是用相关子查询替换联接(这是EF Core在查询转换过程中展开";集合导航属性时内部使用的)。
在您的情况下,请替换
join b in ctx.Bs on a.aId equals b.aId into bs
与
let bs = ctx.Bs.Where(b => a.aId == b.aId)
但是,我强烈建议您添加和使用导航属性。不确定为什么您不能在LINQ中使用";Them到不投影实体的实体,它们只提供关系的元数据,从而自动生成必要的联接。通过不定义它们,您只会给自己施加不必要的限制(附加到EF核心限制/错误)。一般来说,使用导航属性而不是手动联接时,EF Core的工作效果更好,支持的功能更多。
这篇关于无法翻译带有`groupjoin`的查询,尽管文档中将其记录为受支持的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文