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