質問
拡張構文を使用して、持っている 2 つのリストに対して LINQ を使用して左結合を作成しようとしています。以下は Microsoft ヘルプからのものですが、ペット リストに要素がないことを示すために変更しました。最終的に得られるのは、0 個の要素のリストです。これは内部結合が行われているためだと思います。最終的に得たいのは、欠落している要素に null データが入力された 3 つの要素 (3 人の person オブジェクト) のリストです。つまり左結合。これは可能でしょうか?
Person magnus = new Person { Name = "Hedlund, Magnus" };
Person terry = new Person { Name = "Adams, Terry" };
Person charlotte = new Person { Name = "Weiss, Charlotte" };
//Pet barley = new Pet { Name = "Barley", Owner = terry };
//Pet boots = new Pet { Name = "Boots", Owner = terry };
//Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
//Pet daisy = new Pet { Name = "Daisy", Owner = magnus };
List<Person> people = new List<Person> { magnus, terry, charlotte };
//List<Pet> pets = new List<Pet> { barley, boots, whiskers, daisy };
List<Pet> pets = new List<Pet>();
// Create a list of Person-Pet pairs where
// each element is an anonymous type that contains a
// Pet's name and the name of the Person that owns the Pet.
var query =
people.Join(pets,
person => person,
pet => pet.Owner,
(person, pet) =>
new { OwnerName = person.Name, Pet = pet.Name }).ToList();
解決
私はあなたが拡張メソッドを使用したい場合は、 GroupJoin >
var query =
people.GroupJoin(pets,
person => person,
pet => pet.Owner,
(person, petCollection) =>
new { OwnerName = person.Name,
Pet = PetCollection.Select( p => p.Name )
.DefaultIfEmpty() }
).ToList();
あなたは選択式で遊んでする必要があります。私はそれはあなたがあなたが1対多の関係を持っている場合には旺旺与えるかわからない。
私は
LINQクエリ構文と、それは少し楽だと思いますvar query = (from person in context.People
join pet in context.Pets on person equals pet.Owner
into tempPets
from pets in tempPets.DefaultIfEmpty()
select new { OwnerName = person.Name, Pet = pets.Name })
.ToList();
他のヒント
あなたはセットに参加したオブジェクトを取得し、JPunyonが言ったようにDefaultIfEmptyを適用する必要があります
Person magnus = new Person { Name = "Hedlund, Magnus" };
Person terry = new Person { Name = "Adams, Terry" };
Person charlotte = new Person { Name = "Weiss, Charlotte" };
Pet barley = new Pet { Name = "Barley", Owner = terry };
List<Person> people = new List<Person> { magnus, terry, charlotte };
List<Pet> pets = new List<Pet>{barley};
var results =
from person in people
join pet in pets on person.Name equals pet.Owner.Name into ownedPets
from ownedPet in ownedPets.DefaultIfEmpty(new Pet())
orderby person.Name
select new { OwnerName = person.Name, ownedPet.Name };
foreach (var item in results)
{
Console.WriteLine(
String.Format("{0,-25} has {1}", item.OwnerName, item.Name ) );
}
を出力します:
Adams, Terry has Barley
Hedlund, Magnus has
Weiss, Charlotte has
これと同じ問題に直面したときに、次のエラー メッセージが表示されました。
結合句内のいずれかの式の型が正しくありません。「GroupJoin」の呼び出しで型推論が失敗しました。
同じプロパティ名を使用すると解決しました。機能しました。
(...)
join enderecoST in db.PessoaEnderecos on
new
{
CD_PESSOA = nf.CD_PESSOA_ST,
CD_ENDERECO_PESSOA = nf.CD_ENDERECO_PESSOA_ST
} equals
new
{
enderecoST.CD_PESSOA,
enderecoST.CD_ENDERECO_PESSOA
} into eST
(...)
ここで私は尋ねた質問で材料をカバーしていファブリス(アクションでLINQの作者)によって投稿されています優れたブログ記事です。質問の読者は、これは便利だろうと私は参考のためにここでそれを入れている。
<のhref = "http://weblogs.asp.net/fmarguerie/archive/2009/02/06/converting-linq-queries-from-query-syntax-to-method-operator-syntax.aspx" rel = "nofollowをnoreferrer">メソッドにクエリ構文からLINQクエリを変換/演算子の構文の
左LINQに参加はDefaultIfEmpty()メソッドを用いて可能です。私もあなたのケースのための正確な構文を持っていない...
実際には、あなたはそれがうまくいくかもしれないクエリでpets.DefaultIfEmpty()にペットを変更した場合、私は思う...
EDIT:その後半...
私は本当に物事を答えるべきではありませんあなたが実際にデータベースを持っている場合は、これが最も簡単な方法です。
var lsPetOwners = ( from person in context.People
from pets in context.Pets
.Where(mypet => mypet.Owner == person.ID)
.DefaultIfEmpty()
select new { OwnerName = person.Name, Pet = pets.Name }
).ToList();