2009-05-15 5 views
2

Le code suivant est ce que je l'ai utilisé pour identifier les 10 meilleurs articles gagnantTrouver le « le plus amélioré » dans LINQ

var top = (from m in db.Stats 
      where m.Item.AccountID == AccountID 
      && m.DateTime >= month 
      && m.DateTime < month.AddMonths(1) 
      group m by m.Item into g 
      orderby g.Sum(p => p.Earnings) descending 
      select g.Key).Take(10).ToArray(); 

Je dois identifier quel élément a le plus amélioré (%) lorsque l'on compare 2 mois différents . Les données disponibles ne sont que des totaux quotidiens. Je pourrais avoir besoin de filtrer les éléments qui sont en dessous d'un certain nombre de « visiteurs » à savoir où

m.Visitors >= 20 

Quelle est la meilleure façon de le faire dans LINQ-Sql?

Répondre

0

Si vous divisez la requête en deux groupes distincts, le mois courant (ou la période) et le mois précédent (ou la période), il devrait être plus facile à gérer. Pour plus de clarté, j'utilise une classe privée pour conserver les résultats qui nous intéressent. Vous pouvez peut-être utiliser une classe existante à la place. Ou, le compilateur peut même être assez intelligent pour réaliser que les propriétés sont identiques et ainsi générer la même classe anonyme pour les deux requêtes. En tout état de cause ...

private class C { 
    public object Key { get; set; } 

    public object Earnings { get; set; } 
} 

var thisMonth = (from m in db.Stats 
       where m.Item.AccountID == AccountID 
       && m.DateTime.Month == month 
       group m by m.Item into g 
       select new C { g.Key, g.Earnings }); 

var lastMonth = (from m in db.Stats 
       where m.Item.AccountID == AccountID 
       && m.DateTime.Month == month.AddMonths(-1) 
       group m by m.Item into g 
       select new C { g.Key, g.Earnings }); 

De là, il est une question de combiner les résultats pour calculer le gain ou la perte de pour cent entre les deux ensembles. Une fois cela fait, vous pouvez trier par les gains les plus élevés pour obtenir votre top n.

Questions connexes