2011-02-07 5 views
3

Considérez l'objet suivant:Requête LINQ (groupe BY)?

public class Address { public string city; public string state; public string country; } 

Si j'ai une liste d'adresses comment pourrais-je utiliser LINQ pour obtenir une liste de comptes où la ville, l'État et de match de pays.

donc mon résultat pourrait ressembler à ceci:

  • "princeton" "nj" "usa" 122
  • "austin" "tx" "usa" 44
  • "la" « ca " "usa" 1
  • "princton" "na" "uk" 3
  • ....

Merci!

Répondre

9

Je suis allé un peu plus loin que la réponse de Marc (qu'il a éditée avant de poster!). LOL

var qry = from addr in addresses 
      group addr by new { addr.city, addr.state, addr.country } into grp 
      select new 
      { 
      city = grp.Key.city, 
      state = grp.Key.state, 
      country = grp.Key.country, 
      count = grp.Count(), 
      }; 
2
var qry = addresses.GroupBy(addr => new { addr.city, addr.state, addr.country}); 

alors vous pouvez le faire (par exemple):

foreach(var row in qry) { 
    Console.WriteLine("{0} {1} {2} \t {3}", 
       row.Key.city, row.Key.state, row.Key.country, row.Count()); 
} 

à savoir le .Key de chaque groupe est le composite new { addr.city, addr.state, addr.country}, et chaque groupe est également IEnumerable<Address>. Notez que pour les requêtes de base de données, vous devriez lui dire votre intention entière à l'avant, par exemple:

var qry = from addr in db.Addresses 
      group addr by new { addr.city, addr.state, addr.country} into grp 
      select new { 
       grp.Key.city, grp.Key.state, 
       grp.Key.country, Count = grp.Count() 
      }; 

afin qu'il ait la meilleure chance possible de faire une requête raisonnable (pas n + 1).

1

C'est ce que j'ai essayé (en LINQPad) et il fonctionne bien (Tout comme réponse « Enigmativity):

void Main() 
{ 

    List<Address> lst = new List<Address>(); 
    lst.Add(new Address{ city = "ny", state = "cy", country = "india"}); 
    lst.Add(new Address{ city = "ny", state = "cy", country = "india"}); 
    lst.Add(new Address{ city = "by", state = "cy", country = "india"}); 
    lst.Add(new Address{ city = "ny", state = "fr", country = "india"}); 
     var qry = from addr in lst 
     group addr by new { addr.city, addr.state, addr.country } into grp 
     select new 
     { 
      city = grp.Key.city, 
      state = grp.Key.state, 
      country = grp.Key.country, 
      count = grp.Count(), 
     }; 
     qry.Dump(); 
} 
public class Address { public string city; public string state; public string country; } 

Sortie:

 
ny cy india 2 

by cy india 1 

ny fr india 1