2

我有这个代码:

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 });

这很好用,作为具有(可选)地址的人的外部连接。

现在我想通过内部连接将地址类型加入到这个查询中,因为每个地址都只有一个地址类型。所以对于每个人,获取地址,如果有地址,也获取地址类型。

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

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'吗

4

1 回答 1

2

pa使用后不在范围内into

改变

on pa.addresstypeid equals

on addresses.addresstypeid equals
于 2012-11-14T15:03:07.420 回答