C#,Linq2SQL:获得每组最高分

时间:2009-03-03 15:29:39

标签: c# linq-to-sql

假设我有这张表:

PetID    Name    Age    Weight

如何在Linq2SQL中获取每个宠物的名称,年龄和体重,这是其年龄组中最重的?

因此,如果我有一只5岁的宠物和4只2岁的宠物,我想要5岁的宠物的名字,年龄和体重,以及2岁时最重要的4岁之一。那四个。

这应该不会太难,但我还没有深入思考。尽管如此。这是我需要多次的一种问题,但是并不能完全解决这个问题......

我认为它将包括使用Max或a>运营商,以及某种分组或加入,但这就是我已经得到的......


感谢您的回答。当谈到GroupBy时,所有这些都让我走上正轨。我标记为答案的那个是最接近我最终的那个。

3 个答案:

答案 0 :(得分:1)

尝试此查询:

var petsGroup = ctx.Pets.GroupBy(p => p.Age)
                        .Select(g => g.First(x => x.Weight == g.Max(y => y.Weight)));

按年龄对宠物进行分组,然后选择该组中的第一个元素,该元素与该组的最大权重相匹配。

答案 1 :(得分:1)

这对你有什么用。

public class Pet
{
     public int PetID { get; set; }
     public string Name { get; set; }
     public int Age { get; set; }
     public decimal Weight { get; set; }
}

List<Pet> pets = new List<Pet>() 
{ 
    new Pet {PetID = 1, Age = 5, Name = "Bob", Weight = 4M },
    new Pet {PetID = 2, Age = 5, Name = "Brad", Weight = 3M },
    new Pet {PetID = 3, Age = 2, Name = "Troy", Weight = 1M },
    new Pet {PetID = 4, Age = 2, Name = "Dave", Weight = 2M },
    new Pet {PetID = 5, Age = 2, Name = "Simon", Weight = 3M }
};

var fatPetsByAge = from pet in pets
                   group pet by pet.Age into petsByAge
                   select new
                   {
                       Age = petsByAge.Key,
                       FatPet = petsByAge.FirstOrDefault(
                                f => f.Weight == petsByAge.Max(m => m.Weight))
                   };

foreach (var fatty in fatPetsByAge)
{
    Console.WriteLine("PetID: {0}, Age: {1} Name: {2} Weight: {3}",
        fatty.FatPet.PetID,
        fatty.FatPet.Age,
        fatty.FatPet.Name,
        fatty.FatPet.Weight);
}

答案 2 :(得分:0)

可能是这样的:

var pets =  from pet in petSource
            group pet by pet.Age into g
            let max = g.OrderByDescending(p => p.Weight).FirstOrDefault<Pet>()
            select new { Name = max.Name, Age = max.Age, Weight = max.Weight };