2009-09-18 9 views
5

Non sono sicuro se questa è solo una cattiva abitudine, o un modo valido di fare le cose, ma per i grandi query di report complessi che abbracciano mazzi di tabelle, spesso ricevo le mie statistiche aggregate sommando una dichiarazione Case.Qual è il LINQ equivalente a SUM (CASE QUANDO X = Y THEN 1 ELSE 0 END)?

Ad esempio:

SELECT Contact.Name, 
    SUM(CASE WHEN Order.Type = 'Special' THEN 1 ELSE 0 END) AS SpecialOrders, 
    SUM(CASE WHEN Order.Type = 'Magic' THEN 1 ELSE 0 END) AS MagicOrders, 
FROM Contact 
LEFT JOIN Order ON (Contact.ContactID = Order.ContactID) 

Come dovrei farlo in LINQ to SQL? (In vb.net, ma credo che qualche esempio .Net farebbe)

Dim Orders = _ 
    From Order In DB.Orders 
    Select New With {.Name = Contact.Name, 
        .Special = If(Order.Type = "Special", 1, 0), 
        .Magical = If(Order.Type = "Magical ", 1, 0)} 

ho bisogno di sommare i valori .Special e .Magical.

(In realtà, la query occupare diverse tabelle, comprensivi di informazioni-prenotazioni eventi, e la decisione di sommare un record o no dipende campi in molti di essi)

risposta

1
var specialSum = DB.Orders.Sum (o => o.Type == "Special" ? 1 : 0) 
var magicalSum = DB.Orders.Sum (o => o.Type == "Magical" ? 1 : 0) 

Oppure:

var specialSum = DB.Orders.Count (o => o.Type == "Special") 
var magicalSum = DB.Orders.Count (o => o.Type == "Magical") 
+0

Questo è C#, OP è alla ricerca per l'equivalente VB.Net. – JaredPar

+1

"In vb.net, ma credo che qualsiasi esempio .Net farebbe" - questo è quello che ha detto. Ho paura di non parlare VB. –

+0

Inoltre, questo non esegue il join della query sql dell'OP. – paqogomez

0

consiglio vivamente la prima risposta

var specialSum = DB.Orders.Sum (o => o.Type == "Special" ? 1 : 0) 
    var magicalSum = DB.Orders.Sum (o => o.Type == "Magical" ? 1 : 0) 

La seconda risposta è molto più lenta. Non so perché, ma è stato molto più lento secondo i miei test.

Problemi correlati