无法翻译带有`groupjoin`的查询,尽管文档中将其记录为受支持 [英] Query with `groupjoin` cannot be translated although it's documened as being supported

查看:13
本文介绍了无法翻译带有`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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆