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

时间:2015-08-31 02:43:55

标签: c# sql-server linq entity-framework

这可能有一个非常明显的答案,但我在某种程度上画了一个空白。我有三张桌子,比方说它们叫:

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)。

2 个答案:

答案 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));