C #, Linq2SQL: получение максимальной из каждой группы - PullRequest
1 голос
/ 03 марта 2009

Допустим, у меня есть эта таблица:

PetID    Name    Age    Weight

Как я могу в Linq2SQL получить имя, возраст и вес каждого питомца, который является самым тяжелым в своей возрастной группе?

Итак, если у меня есть один питомец в возрасте 5 лет и четыре питомца в возрасте 2 лет, мне бы хотелось, чтобы имя, возраст и вес того, кому было 5 лет, и одного из четырех с возрастом 2, который был самым тяжелым эти четыре.

Вероятно, это не должно быть слишком сложно, но я пока не слишком увлекаюсь запросами. Работая над этим все же. И это одна из тех проблем, которая мне понадобится много раз, но мне не совсем удастся обернуться, как это сделать ...

Я думаю, что это будет включать в себя использование оператора Max или> и какую-то группировку или объединение, но это все, насколько я понял ....


Спасибо за ответы. Все они ставят меня на правильный путь, когда дело доходит до материала GroupBy. Тот, который я отметил как ответ, был тем, который был ближе всего к тому, что я закончил.

Ответы [ 3 ]

1 голос
/ 03 марта 2009

как это для вас.

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);
}
1 голос
/ 03 марта 2009

Попробуйте этот запрос:

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

Группирует домашних животных по возрасту, а затем выбирает первый элемент в группе, соответствующий максимальному весу группы.

0 голосов
/ 03 марта 2009

Это может быть что-то вроде этого:

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 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...