2012-11-14 106 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