【问题标题】:Many to Many select in LINQ to EntitiesLINQ to Entities 中的多对多选择
【发布时间】:2012-06-21 11:01:28
【问题描述】:

我有两张桌子ServiceProvider。它们之间是一个连接表 ServiceProvider,它只有 2 个字段 - 一个用于两个 PK 中的每一个。当添加到 edmx 时,连接的多对多表被抽象出来并且无法看到(如预期的那样)。

这一切都很好,除非我想获得基于给定服务的提供者。来自这个question

看起来答案很简单:

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

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

【问题讨论】:

  • s 没有可以使用的Providers 属性吗?
  • 是的 s.Providers 是 Providers 的集合,但我也无法将其作为选择的一部分。
  • @abatishchev - 感谢您的编辑,但如果有人搜索实体框架多对多,不会更改标题会使问题更难找到? (我意识到它的 EF 是由标签定义的,但是搜索会发现)
  • @finoutlook:你总是可以随意改回标题,我的编辑只是一个建议,不要在标题的开头放置标签,但如果你愿意 - 让它更多以文学风格。

标签: c# .net entity-framework linq-to-entities many-to-many


【解决方案1】:
var query = entities.Providers.FirstOrDefault(p => p.Id == 15).Services.ToList();

【讨论】:

  • 我认为你的 ProvidersServices 弄错了。
  • 是的,它是我试图输出的供应商,但无论如何我看到它是对称的
  • @finoutlook:正确的解决方案是 Maciej Dopieralski 的回答。此答案中的代码将 1)在没有 Id=15 的提供者时崩溃,2)如果您使用 POCO 并且未启用延迟加载,则崩溃,3)创建两个数据库查询而不是仅一个。罗林的回答也有同样的缺陷。
【解决方案2】:

是不是就这么简单

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

【讨论】:

  • 这行得通。我仍然很困惑为什么我提到的另一个问题得到了赞成 - 这篇文章有相同的“双重来自”的建议:smehrozalam.wordpress.com/2010/06/29/…
  • @finoutlook 我对实体框架不是很熟悉,但如果这可行——而且它似乎并不太牵强——那么它就可以了 :)
  • halit 首先得到了答案,这非常相似(尽管选择了错误的一面)-但不知道编辑是否在您的答案之后
  • @fin 如果我没有看到 halit's,我不会认为这有效并发布了我的答案,所以如果你接受他的,我不会被淘汰 :) (虽然我更喜欢我的使用SingleFirstOrDefault 也是。)
  • 我会接受较早的答案,尽管我会投票,但感谢您的帮助
【解决方案3】:

试试这个:

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

编辑

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

【讨论】:

  • 这在多对多关系中是行不通的,因为集合类型通常没有Id 属性。
【解决方案4】:

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

entity.Providers.Join(entity.Services, c => c.ID, p => p.ID,(c, p) => new { Providers= c, Services= p })

【讨论】:

  • 为什么提供者 ID 应该等于服务 ID?当 fin 只想要提供者列表时,为什么要选择 { Providers, Services } 对?
  • 只是向他提出一种他能理解的方式。他可以稍后设置并删除他不需要的内容
  • 所以他可以删除Join 声明?
  • 实体框架已经知道连接。您不必在此处指定。
猜你喜欢
  • 2011-05-14
  • 2011-04-12
  • 2012-01-15
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多