Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ to实体中的多对多选择_C#_.net_Entity Framework_Linq To Entities_Many To Many - Fatal编程技术网

C# LINQ to实体中的多对多选择

C# LINQ to实体中的多对多选择,c#,.net,entity-framework,linq-to-entities,many-to-many,C#,.net,Entity Framework,Linq To Entities,Many To Many,我有两个表Service和Provider。它们之间是一个连接表ServiceProvider,该表只有两个字段-两个PK各有一个字段。当添加到edmx时,连接多对多表被抽象掉,无法看到(如预期的那样) 这一切都很好,除非我想要基于给定服务获取提供者。由此: 看起来答案很简单: var query = from p in entities.Providers from s in entities.Services where s.Id == 15

我有两个表
Service
Provider
。它们之间是一个连接表
ServiceProvider
,该表只有两个字段-两个PK各有一个字段。当添加到edmx时,连接多对多表被抽象掉,无法看到(如预期的那样)

这一切都很好,除非我想要基于给定服务获取提供者。由此:

看起来答案很简单:

var query = from p in entities.Providers
            from s in entities.Services
            where s.Id == 15
            select p;

但这将返回所有提供者。我做错了什么?

您可以尝试使用
join
,如下所示:

var query = entities.Providers.FirstOrDefault(p => p.Id == 15).Services.ToList();
entity.Providers.Join(entity.Services, c => c.ID, p => p.ID,(c, p) => new { Providers= c, Services= p })
试试这个:

var res = from s in entities.Services
          where s.Id == 15
          select s.Provider;
编辑

修正并测试了对真实模型和数据的查询。它现在可以用了。

难道没有这么简单吗

var matchingProviders = entities.Services.Single(s=>s.Id==15).Providers;


s
是否没有可以使用的
Providers
属性?是的。s.Providers是提供程序的集合,但我无法将其作为select的一部分。@abatishchev-感谢您的编辑,但如果有人搜索实体框架多对多,更改标题不会使问题更难找到吗?(我意识到它的EF是由标签定义的,但搜索是否会发现它)@finoutlook:你可以随时更改标题,我的编辑只是一个建议,不要将标签放在标题的开头,但是,如果你想的话,让它更具文学风格。我认为你的
提供者
服务
的方式是错误的。是的,我试图输出的是提供者,但我看到它是对称的anyway@finoutlook:正确的解决方案在Maciej Dopieralski答案中。此答案中的代码将1)在没有Id=15的提供程序时崩溃,2)在使用POCOs且未启用延迟加载时崩溃,3)创建两个数据库查询,而不是仅创建一个。罗琳的答案也有同样的缺陷。为什么提供者ID应该等于服务ID?当fin只是想要一个提供者列表时,为什么你要选择一个{Providers,Services}对呢?只是给他一个他能理解的方法。他可以稍后设置并删除不需要的内容,以便删除
Join
语句?实体框架已经知道连接。您不必在此处指定。这在多对多关系中不起作用,因为集合类型通常没有
Id
属性。这是有效的。我仍然很困惑,为什么我提到的另一个问题得到了投票——这篇文章也有同样的“double from”建议:@finoutlook我对实体框架不是很熟悉,但是如果这个方法有效——而且它看起来不太牵强——那么它就有效了:)halit首先得到了答案,这非常相似(尽管选择了错误的一面)-但不知道编辑是否在您的answer@fin如果我没有看到哈利特的,我就不会认为这是有效的,也不会发布我的答案,所以如果你接受他的:)(虽然我更喜欢使用
Single
而不是
FirstOrDefault
)我会接受之前的答案,谢谢你的帮助,不过我会投票的