私はこのコードを持っています:
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 });
これは、(オプションの)住所を持つ人の外部結合としてうまく機能します。
すべてのアドレスには正確に1つのアドレスタイプがあるため、アドレスタイプをこのクエリに内部結合で結合したいと考えています。したがって、すべての人について住所を取得し、住所がある場合は住所タイプも取得します。
だから私はこれを作成しました(アドレスタイプに内部結合を追加しました):
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でnull参照エラーが発生するようになりました....
これを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」は範囲外です、それはこのコードの「バー」ではありませんか