这可能有一个非常明显的答案,但我在某种程度上画了一个空白。我有三张桌子,比方说它们叫:
People
Addresses
AddressDetails
我正在使用实体框架(以上是正确设置关系的模型)。我试图用典型的EF LINQ查询选择数据(无论是方法还是查询语法都无关紧要)。
人和地址是多对多的。地址和地址详细信息是一对一(/零)。我需要从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)。
答案 0 :(得分:1)
你应该可以这样做:
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 Samples
答案 1 :(得分:1)
这可能是实现您所寻找目标的另一种方式:
var id=1;
var query= context.People
.Where(p=>p.Id==id)
.SelectMany(p=>p.Addresses.Select(a=>a.AddressDetails));
此处的关键是使用SelectMany
方法,将生成的AddressDetails
序列展平为一个序列。
如果您已禁用lazy loading,请调用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));