我有这段代码:
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'
答案 0 :(得分:2)
pa
后, into
不在范围内
变化
on pa.addresstypeid equals
到
on addresses.addresstypeid equals