2008-10-08 7 views
3

Je me déplace DB de MySQL (utilisé ODBC) pour MS SQL et je veux "traduire" les requêtes SQL à LINQ. Quelqu'un peut-il m'aider avec cela (il devrait SUM Charge la colonne pour chaque emplacement et le résultat du groupe par mois):commande SQL LINQ (pivotant)

SELECT 
sum(case when Location="Location1" then Charge else 0 end) as Location1, 
sum(case when Location="Location2" then Charge else 0 end) as Location2, 
sum(case when Location="Location3" then Charge else 0 end) as Location3, 
MAKEDATE(YEAR(OrderTime),DAYOFYEAR(OrderTime)) AS date FROM Sales 
GROUP BY YEAR(OrderTime),MONTH(OrderTime) 
ORDER BY OrderTime DESC 

?

sortie devrait ressembler à ceci:

Location1 | Location2 | Location3 | date 

EDIT:

I tryed à utiliser l'échantillon LINQ d'ici:

Is it possible to Pivot data using LINQ?

var query = context.log_sales 
          .GroupBy(c => c.OrderTime) 
          .Select(g => new 
          { 
           Date = g.Key, 
           Location1 = g.Where(c => c.Location == "Location1").Sum(c => c.Charge) ?? 0, 
           Location2 = g.Where(c => c.Location == "Location2").Sum(c => c.Charge) ?? 0 
          }).ToList(); 

et il est presque ce que je avoir besoin. Il devrait y avoir un regroupement par année aussi et je ne sais pas comment faire cela.

+0

travail sur une réponse ... je voulais simplement mentionner que la clause ORDER BY dans le sql est pas valide. OrderTime a été regroupé et ne peut pas être utilisé ici. –

Répondre

6

Cela pourrait aider.

context.log_sales 
.GroupBy(s => new {Year = OrderTime.Year, Month = OrderTime.Month}) 
.Select 
(g => new { 
    Date = new DateTime(g.Key.Year, g.Key.Month, 1), 
    Location1 = g.Where(s => s.Location == "Location1").Sum(s => s.Charge), 
    Location2 = g.Where(s => s.Location == "Location2").Sum(s => s.Charge), 
    Location3 = g.Where(s => s.Location == "Location3").Sum(s => s.Charge), 
    } 
) 
.OrderBy(x => x.Date); 
+0

Avez-vous vérifié ce que SQL génère cette expression Linq? C'est assez énorme. – GrZeCh

0

.. savez-vous comment créer dynamiquement des emplacements à sélectionner dynamiquement? Par exemple à partir de List/Array.

EDIT: .. ou peut-être faire emplacements pour charger dynamiquement et réglage quels emplacements doivent être chargés dans Où déclaration avant Select. Est-ce possible?