使用非关联数据 (LINQ) 从多对多关系中获取值

Posted

技术标签:

【中文标题】使用非关联数据 (LINQ) 从多对多关系中获取值【英文标题】:Getting values from a many-many relationship using unassociated data (LINQ) 【发布时间】:2015-08-27 16:50:09 【问题描述】:

我在 MVC 4/EF 6 中设置了以下(简化的)数据库。每个类在其模型中使用标准 public virtual ICollection<SalesOrder> SalesOrders get; set; (反之亦然)引用另一个。我是 EF 和 C# 以及诸如此类(但不是 SQL)的新手,所以这可能很简单,但我不确定如何做到这一点:我需要编写一个函数来返回每个 SalesOrder.ExternalId 的列表与给定的OrderChangeNotice.Id 关联。这没有任何过滤,所以我知道这是错误的,但这是我一直在尝试的查询的一个想法:

ocnRepository.SelectMany(n => n.SalesOrders.Select(o => o.ExternalId)).ToList();

如何正确编写此查询?

简化的数据库架构:

如果有帮助,这里是表映射代码(在OrderChangeNotice 的映射文件中,SalesOrder 的映射中不存在类似代码,因为它只需要一个)。

this.HasMany(o => o.SalesOrders)
    .WithMany(o => o.OrderChangeNotices)
    .Map(m =>
    
        m.ToTable("OCN_SalesOrders");
        m.MapLeftKey("OrderChangeNoticeId");
        m.MapRightKey("SalesOrderId");
);

【问题讨论】:

【参考方案1】:

我更习惯 NHibernate,但我认为它应该是这样的:

ocnRepository.SelectMany(n => n.SalesOrders)
             .Where(so => so.OrderChangeNoticeId == myOrderChangeNoticeId)
             .Select(o => o.ExternalId)
             .ToList();

【讨论】:

这不会返回 all ExternalIds 的列表吗?我在那里看不到任何类型的过滤。 (希望我能用 LINQPad 来测试这些东西。) 忘记添加Where 子句。更新了答案! 刚试过。 so 是一个 SalesOrder 对象,所以我无法与那里的任何东西进行比较(它没有 OrderChangeNoticeId 属性)。我只是将连接表放在图像中以阐明它是多对多的关系; EF 为我处理了这个问题,实际上永远不可能直接查询连接表本身。 (这就是为什么每个类都需要 ICollection 导航属性。) 这只是所有必要变量的声明,仅此而已。 (嗯,它也有using 语句,但我想你明白我的意思。)相关行是public virtual ICollection<OrderChangeNotice> OrderChangeNotices get; set; 。如果有帮助,我已将数据库映射代码添加到 OP。 看看这是否有帮助:***.com/questions/10803840/…

以上是关于使用非关联数据 (LINQ) 从多对多关系中获取值的主要内容,如果未能解决你的问题,请参考以下文章

从多对多关系中获取核心数据

如何在 Laravel 中从多对多关系的一对多关系中获取项目?

从多对多关系中获取结果

使用实体框架从多对多关系中选择数据

从多对多关系的桥接表中检索数据的查询[关闭]

核心数据 - 从多对多关系构建 NSPredicate