我将尝试以最佳方式描述这一点。我能想到的最好的方法是给你一个数据集。
动物
ID类型
1个狮子会
2老虎
3只熊
AnimalDetails
ID AnimalId身高体重
1 1 62英寸200磅
2 1 56英寸150磅
3 1 23英寸125磅
4 2 47英寸500磅
5 2 88英寸150磅
6 2 15英寸125磅
如果有帮助,请假装这些表已加入
也许有一个FK到其他一些表,其中包含每种动物类型的详细数据;高度,宽度,年龄等
我想按动物类型(狮子等)分组并选择它,但也选择狮子的细节。
所以我希望Key成为Lion,然后可能是狮子信息的集合。
这有意义吗?
我的尝试显然无法奏效,但无论如何它仍然存在:
var animals = (from a in Animals
group a by new { AnimalType = a.Type }
into grouped
select grouped);
更新 添加了伪表结构。我不是在寻找1的答案,因为这显然是假数据,只是在寻找如何实现这一目标的方向。
答案 0 :(得分:2)
我会读到这篇SO文章:Linq with Left Join on SubQuery containing Count
在动物上执行您的普通组,然后将AnimalId加入到详细信息表中以获取详细信息属性。
编辑:
var query = (from d in details
join a in
(from animal in animals
group animal by animal.Name into g
select new { Name = g.Key }) on d.Name equals a.Name
select new { a.Name, d.Height, d.Weight }).ToList();
上面的查询假定您没有加入伪数据表。如果他们已经加入,那么我不明白你为什么要按动物名称分组然后提取细节,因为你的例子中的细节每个动物出现不止一次。 (1只狮子有多个细节记录)。
答案 1 :(得分:0)
你在使用group by的动物中丢失了id值。如果丢失id值,则不能在动物和动物详细信息之间使用foreinKey。因此,您不使用group by使用此代码,您可以获取animalDetails。
var listAnimals = new List<Animals>
{
new Animals {Id = 1, Name = "Lions"},
new Animals {Id = 2, Name = "Tigers"},
new Animals {Id = 3, Name = "Bears"}
};
var listAnimalDetails = new List<AnimalDetails>
{
new AnimalDetails {Id = 1, AnimalId = 1, Height = 62, Weight = 200},
new AnimalDetails {Id = 2, AnimalId = 1, Height = 56, Weight = 150},
new AnimalDetails {Id = 3, AnimalId = 1, Height = 23, Weight = 125},
new AnimalDetails {Id = 4, AnimalId = 2, Height = 47, Weight = 500},
new AnimalDetails {Id = 5, AnimalId = 2, Height = 88, Weight = 150},
new AnimalDetails {Id = 6, AnimalId = 2, Height = 15, Weight = 125}
};
var join = (from anm in listAnimals
join anmD in listAnimalDetails
on anm.Id equals anmD.AnimalId
select new
{
Animal = anm.Name,
H = anmD.Height,
W = anmD.Weight
}).ToList();
之后,您可以在联接上使用group by。我希望你会帮忙。