如何通过中间表关系选择条目
本文关键字:选择 关系 何通过 中间 | 更新日期: 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));