Entity framework 如何使用EntityFrameworkCore2.1查询多对多关系?

Entity framework 如何使用EntityFrameworkCore2.1查询多对多关系?,entity-framework,asp.net-core,ef-core-2.0,ef-core-2.1,Entity Framework,Asp.net Core,Ef Core 2.0,Ef Core 2.1,我试图首先使用EF Core代码从多对多关系中选择数据,但出现以下错误: 未处理的异常:System.ArgumentException:必须是可还原节点 我不认为我做了什么特别奇怪的事情,我可以在LinqPad中使用LinqToSQL愉快地运行有问题的查询。希望有人能指出我错在哪里 我已经在控制台应用程序中创建了一个最小的、人为的复制,可以找到。基本上,我使用连接表对多对多关系进行了建模,如下所示: 在发生错误之前,我在控制台中收到以下警告: Microsoft.EntityFramework

我试图首先使用EF Core代码从多对多关系中选择数据,但出现以下错误:

未处理的异常:System.ArgumentException:必须是可还原节点

我不认为我做了什么特别奇怪的事情,我可以在LinqPad中使用LinqToSQL愉快地运行有问题的查询。希望有人能指出我错在哪里

我已经在控制台应用程序中创建了一个最小的、人为的复制,可以找到。基本上,我使用连接表对多对多关系进行了建模,如下所示:

在发生错误之前,我在控制台中收到以下警告:

Microsoft.EntityFrameworkCore.Query[20500] LINQ表达式“from f_uuanonymoustype02 0 in{from FooBar fb in valueMicrosoft.EntityFrameworkCore.Query.Internal.EntityQueryable1[reducebleNodeDemo.FooBar]在属性[fb]上的值microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable1[reducebleNodeDemo.Bar]中加入Bar fb.Bar,其中?=Property[f],Id==属性[fb],FooId=?选择新的f\uu匿名类型02ID=[f]。Id,值=[fb.Bar]。值}'无法转换,将在本地计算


我是EF Core的新手,但我已经在EF6上工作多年了,从来没有遇到过像这样的简单查询问题

> P>显然你正在攻击当前的EF核心实现错误,所以考虑将其报告给他们的问题跟踪器。

这似乎是由SelectMany内部的Select和内部lambda内部使用外部参数f引起的。解决方法是将SelectMany重载与元素选择器一起使用:

.SelectMany(f => f.FooBars, (f, fb) => new { f.Id, fb.Bar.Value })
我相信当您使用等效的LINQ查询语法时,C编译器会使用它

(from f in this.context.Foos
 from fb in f.FooBars
 select new { f.Id, fb.Bar.Value })
在这种特殊情况下,另一种解决方法/解决方案是直接从FooBar启动查询,这是多对多显式连接实体的优点之一

this.context.Set<FooBar>()
    .Select(fb => new { fb.Foo.Id, fb.Bar.Value });

错误信息非常清楚。在您正在使用的EF Core版本中,无法将上述查询转换为SQL或您正在使用的任何db提供程序。因此,查询将在没有它的情况下进行,无法翻译的参与方将在内存中的应用程序中进行筛选。这可能是一个迹象,表明您通过该查询接收到大量数据,因为其中的某些部分必须在应用程序中的内存中完成。我认为这一点不清楚,否则我不会问。而且它实际上并没有运行,所以它显然也不能在内存中运行。它肯定不会返回大量的数据,因为查询甚至不会访问数据库。这是一个非常简单的查询,其他库可以将其转换为SQL,甚至我也可以将其转换为SQL。我的问题是我应该如何写一个查询来获取我想要的数据?谢谢@IvanStoev!完美的答案,立刻让我重新开始工作!在过去的几个月里,我已经在他们的回购协议上发布了一些其他的问题,所以我也会添加这些。在这种情况下,我只是觉得我做了一些愚蠢的事情。已经有一个我添加了一个评论,链接到你的答案,但现在它没有出现!请稍后再试
(from f in this.context.Foos
 from fb in f.FooBars
 select new { f.Id, fb.Bar.Value })
this.context.Set<FooBar>()
    .Select(fb => new { fb.Foo.Id, fb.Bar.Value });