2017-01-05 11 views
2

あなたが拡張メソッドにこのLINQクエリを変換するために私を助けてもらえ:LINQ拡張メソッドを使用した外部結合

var query = from person in people 
       join pet in pets on person equals pet.Owner into gj 
       from subpet in gj.DefaultIfEmpty() 
       select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) }; 

クエリは左外側についてMSDN pageから来る参加します。

私はすでにこれをしなかった:

var result = people.join(pets, x, y => y.Owner, (x, y) => { 
        x.FirstName, 
        PetName = y == null ? String.Empty : y.Name 
       }).ToList(); 

しかし、私はDefaultIfEmpty()で何をすべきかわかりませんか?

他の解決方法で説明したようにDefaultIfEmpty()を追加すると、CS0746が無効になります。匿名型メンバー宣言子が無効です。匿名型メンバーは、メンバー割り当て、単純な名前またはメンバーアクセスで宣言する必要があります。

+0

と、次のように行うことができますか?ジョインはクエリの構文とメソッドの構文で非常にクリーンなので、パフォーマンス面で利点はありません。 –

答えて

1

あなたがメソッドの構文を使用しなければならないのはなぜGroupJoin

people.GroupJoin(pets,p => p,pt => pt.Owner, 
       (p, pt) => new { p.FirstName, names = pt.Select(y => y.Name)}) 
     .SelectMany(p => p.names.DefaultIfEmpty().Select(x => new {p.FirstName,PetName=x})) 
関連する問題