如何通过中间表关系选择条目

本文关键字:选择 关系 何通过 中间 | 更新日期: 2023-09-27 18:10:24

这可能有一个非常明显的答案,但不知何故我画一片空白。我有三个表,命名为:

People   
Addresses  
AddressDetails

我正在使用实体框架(所以上面是正确设置关系的模型)。我试图用典型的EF LINQ查询选择数据(无论方法还是查询语法)。

人员和地址是多对多的。地址和AddressDetails是一对一的(/零)。我需要从AddressDetails中选择与特定PersonId对应的所有条目。我知道连接在那里,因为我可以选择PersonId = n的所有地址,并且每个地址只有一个AddressDetails条目,但是我如何正确地做到这一点?


我试了如下:

            var details = 
                from p in db.People
                where p.Id = n
                from a in p.Addresses
                from ad in a.Details
                select ad; 

Visual Studio突出显示了a.Details中的"Details",并给出了以下内容:

API.Models。"Addresses"不包含"API.Models.Details"的定义…

我相当确定这基本上是EF告诉我它没有看到关系。我确实证明了一对一是存在的。什么好主意吗?EF没有看到它是因为地址表中没有FK吗?(地址PK为详细信息PK/FK)。

如何通过中间表关系选择条目

您应该能够这样做:

var details = 
    from p in People
    where p.Id = n
    from a in p.Addresses
    from ad in a.Details
    select ad; 

供参考:LINQ的一个很好的参考是101 LINQ样本

这可能是实现您正在寻找的另一种方法:

var id=1;
var query= context.People
                  .Where(p=>p.Id==id)
                  .SelectMany(p=>p.Addresses.Select(a=>a.AddressDetails));

这里的关键是使用SelectMany方法,它将得到的AddressDetails序列平坦化为一个序列。

如果你已经禁用了延迟加载,调用Include方法来加载相关的导航属性作为查询的一部分:

var id=1;
var query= context.People
                  .Include(p=>p.Addresses.Select(a=>a.AddressDetails))
                  .Where(p=>p.Id==id)
                  .SelectMany(p=>p.Addresses.Select(a=>a.AddressDetails));