[英]C# Linq Inner Join
我想選擇只有寵物的人。
當我執行查詢
var query = from p in people
join
pts in pets
on p equals pts.Owner into grp
select new {grp=grp,PersonName=p.FirstName};
沒有寵物的人也會被選中。
我的名單是
Person[] prn = new Person[3];
prn[0] = new Person();
prn[0].FirstName = "Jon";
prn[0].LastName = "Skeet";
prn[1] = new Person();
prn[1].FirstName = "Marc";
prn[1].LastName = "Gravell";
prn[2] = new Person();
prn[2].FirstName = "Alex";
prn[2].LastName = "Grover";
List<Person> people = new List<Person>();
foreach (Person p in prn)
{
people.Add(p);
}
Pet[] pt = new Pet[3];
pt[0] = new Pet();
pt[0].Name = "Zonny";
pt[0].Owner = people[0];
pt[1] = new Pet();
pt[1].Name = "Duggie";
pt[1].Owner = people[0];
pt[2] = new Pet();
pt[2].Name = "Zoggie";
pt[2].Owner = people[1];
List<Pet> pets=new List<Pet>();
foreach(Pet p in pt)
{
pets.Add(p);
}
那是因為你正在使用join ... into
群組加入。 你只想要一個普通的連接:
var query = (from p in people
join pts in pets on p equals pts.Owner
select p).Distinct();
或者,如果您想要有寵物的人及其主人,您可以做以下事情:
var query = pets.GroupBy(pet => pet.Owner)
.Select(x => new { Owner = x.Key, Pets = x.ToList() });
這將產生一個結果,你可以得到每個主人和他們的寵物,但只有有寵物的人。
如果你想要別的東西,請告訴我們......
順便說一下,現在是了解對象和集合初始化器的好時機。 這是一種初始化people
列表的簡單方法,例如:
List<Person> people = new List<Person>
{
new Person { FirstName = "Jon", LastName = "Skeet" },
new Person { FirstName = "Marc", LastName = "Gravell" },
new Person { FirstName = "Alex", LastName = "Grover" },
};
更緊湊:)
編輯:交叉連接很簡單:
var query = from person in people
from pet in pets
select new { person, pet };
使用組連接有效地模擬左連接。 聽起來你有深度C#,我建議你仔細閱讀第11章:)
這是一種不同的方法,只添加一行:
var query = from p in people
join pts in pets
on p equals pts.Owner into grp
where grp.Any() // <--- added this
select new {grp=grp,PersonName=p.FirstName};
在這里,我像你一樣選擇組,但我添加了一行,只選擇包含至少一個元素的組,並忽略其余的組。
這也可以在單行代碼中使用lambda表達式完成...
IEnumerable<Person> peopleWithPets = people.Where(x => pets.Any(y => y.Owner == x));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.