Linq-to-sql查询组依旧选择细节

时间:2011-12-21 18:23:05

标签: c# linq linq-to-sql

我将尝试以最佳方式描述这一点。我能想到的最好的方法是给你一个数据集。

动物
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的答案,因为这显然是假数据,只是在寻找如何实现这一目标的方向。

2 个答案:

答案 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。我希望你会帮忙。