【问题标题】:Getting values from a many-many relationship using unassociated data (LINQ)使用非关联数据 (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");
});

【问题讨论】:

    标签: c# asp.net-mvc linq entity-framework


    【解决方案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。
    • 看看这是否有帮助:stackoverflow.com/questions/10803840/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多