Linq到实体外连接,然后是内连接

时间:2012-11-14 14:57:31

标签: linq linq-to-entities

我有这段代码:

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。 因此,对于每个人,获取地址,如果它有地址,也可以获得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 / bar替换表)

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

与评论中的不一样,'pa'超出范围,不是此代码中的'bar'

1 个答案:

答案 0 :(得分:2)

使用pa

后,

into不在范围内

变化

on pa.addresstypeid equals

on addresses.addresstypeid equals