2012-11-14 104 views
2

我有这样的代码:LINQ到实体外连接,然后内部联接

var query = (from p in dc.GetTable<Person>() 
join pa in dc.GetTable<PersonAddress>() on p.Id equals pa.PersonId into tempAddresses 
from addresses in tempAddresses.DefaultIfEmpty() 
select new { p.FirstName, p.LastName, addresses.State }); 

这个工程很好,作为一个外连接他们的(可选)地址的人。

现在我想加入这个带有内部联接的查询的addresstype,因为每个地址都只有一个addresstype。 因此,对于每个人来说,得到地址,如果有地址,也可以获得地址类型。

所以我创造了这个(增加了内部连接到地址类型):

var query = (from p in dc.GetTable<Person>() 
join pa in dc.GetTable<PersonAddress>() on p.Id equals pa.PersonId into tempAddresses 
from addresses in tempAddresses.DefaultIfEmpty() 
join at in dc.GetTable<AddressTypes>() on pa.addresstypeid equals at.addresstypeid 
select new { p.FirstName, p.LastName, addresses.State, at.addresstype }); 

现在我得到的当人没有地址的pa.addresstypeid的空引用错误....

有没有办法在linq中创建这个?

上面的代码的行为酷似我的代码,但我的代码有不同的实体,但我不能表现出实际的代码...

编辑:

这里是我的代码示例实际上作品(替换FOO /栏中表)

from foo in foos 
join bar in new barRepository(SessionTicket).GetList() 
    on foo.barId equals bar.barId 
join barpersonbar in new barPersonbarRepository(SessionTicket,personId).GetList().Where(z=>z.PersonId == personid) 
    on bar.barId equals barpersonbar.barId 
    into outerbarpersonbar 
from barpersonbar in outerbarpersonbar.DefaultIfEmpty() 

那不是相同您评论即扩声'超出范围不是在这次“酒吧”代码

+1

我很惊讶,甚至编译 - 你不应该使用'addresses'而不是' pa'在后面的代码中? 'pa'不在范围之内。 –

+0

我编辑了这个问题 – Michel

回答

2

pa心不是在范围上,一旦你使用into

变化

on pa.addresstypeid equals 

on addresses.addresstypeid equals 
+1

这可能只是意味着原始代码不准确 - 它并不真正回答这个问题。 –

+0

@JonSkeet - 好点。随着问题的演变,我会发展我的答案 – Aducci

+0

我编辑了这个问题 – Michel