2010-02-24 6 views
0

J'ai une liste de mots-clés;Linq2Sql, GroupBy et renvoie un objet spécifique

  • pizza (22:13)
  • lait (22:12)
  • pizza (22:11)
  • pizza (22:10)
  • lait (10: 21 heures)
  • haricots (22:08)
  • maïs (22:07)
  • jus (22:06)
  • foo (10: 17 heures)

Je veux les regrouper comme ça (top 5, avis foo est pas dans la liste):

  • Pizza (3) (22:13)
  • Lait (2) (22:12)
  • Beans (1) (22:08)
  • de maïs (1) (22:07)
  • jus (1) (22:06)

Donc, fondamentalement: liste des mots-clés après la date de création, regroupés par mot-clé et .Take (5). Et comment est-ce possible en utilisant des expressions lambda? Et comment les renvoyer comme objet d'un type spécifique? Disons le type LatestSearch.

MISE À JOUR terminé avec cette requête:

var searches = db.Searches 
      .GroupBy(s => s.Keyword) 
      .Select(g => g.OrderByDescending(o => o.CreatedDate).First()) 
      .OrderByDescending(o => o.CreatedDate) 
      .Take(5); 
+0

Que voulez-vous dire par «après la date de création»? – SLaks

+0

Je ne suis toujours pas sûr de ce que vous voulez dire. – SLaks

Répondre

2

Comme ceci:

table.Where(s => whatever) 
    .GroupBy(s => s.Keyword) 
    .Select(g => new { 
     Keyword = g.OrderByDescending(s => s.Date), 
     Count = g.Count(), 
     Date = g.Max(s => s.Date()) 
     }) 
    .OrderByDescending(s => s.Count) 
    .Take(5); 

EDIT: Si vous voulez seulement un IEnumerable<LatestSearch>, écrivez ce qui suit:

table.Where(s => whatever) 
    .GroupBy(s => s.Keyword) 
    .OrderByDescending(g => g.Count()) 
    .Select(g => g.First()); 
    .Take(5); 
+0

Merci, pour la réponse, SLaks. J'ai mis à jour ma question. Désolé pour la confusion. – Kordonme

+0

On dirait ce que je cherche! Mais comment les renvoyer en tant que IEnumerable ? – Kordonme

+0

Oui, mais je ne veux pas commander par Count(), mais .CreatedDate :-) – Kordonme