2009-03-03 6 views
1

permet de dire que j'ai cette table:C#, Linq2SQL: Obtenir le plus élevé de chaque groupe

PetID Name Age Weight 

Comment puis-je dans un Linq2SQL obtenir le nom, l'âge et le poids de chaque animal qui est le plus lourd dans son âge groupe? Donc, si j'ai un animal de compagnie âgé de 5 ans et quatre animaux de compagnie de 2 ans, je voudrais le nom, l'âge et le poids de celui qui a 5 ans, et celui des 4 avec 2 ans qui est le plus difficile. de ces quatre.

Cela ne devrait probablement pas être trop difficile, mais je ne suis pas encore trop en train de réfléchir. Travailler dessus cependant. Et c'est un type de problème dont j'ai besoin à plusieurs reprises, mais je n'arrive pas à comprendre comment faire ...

Je pense qu'il faudrait utiliser l'opérateur Max ou a>, et certains sorte de regroupement ou de rejoindre, mais c'est à peu près aussi loin que je l'ai eu ....


Merci pour les réponses. Tout d'entre eux m'a mis sur la bonne voie quand il s'agit de GroupBy. Celui que j'ai marqué comme une réponse, était celui qui était le plus proche de ce que j'ai fini avec.

Répondre

0

Il pourrait être quelque chose comme ceci:

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 }; 
+0

J'ai fini par faire quelque chose de semblable à cela. Utilisation de OrderByDescending J'ai trouvé cela plus facile que les trucs First et Max ... mais peut-être que les autres sont plus efficaces d'une manière ou d'une autre? – Svish

+0

J'ai utilisé la syntaxe de la méthode (ou comment elle s'appelle). Donc, comme, var heavyPets = pets.OrderByDescending (ø => ø.Weight) .GroupBy (ø => ø.Age) .Sélectionnez (ø => ø.First()). Ou quelque chose comme ça :) – Svish

1

Essayez cette requête:

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

Elle regroupe les animaux par âge et sélectionne ensuite le premier élément du groupe, que le poids matchs maximum du groupe.

1

comment est-ce pour vous.

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); 
} 
Questions connexes