2009-09-18 18 views
5

No estoy seguro de si esto es solo un mal hábito, o una forma válida de hacer las cosas, pero para grandes consultas de informes complejos que abarcan racimos de tablas, a menudo obtengo mis estadísticas agregadas al sumar una declaración Case.¿Cuál es el LINQ equivalente a SUMA (CASO CUANDO X = Y THEN 1 ELSE 0 END)?

Por ejemplo:

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) 

¿Cómo voy a hacer esto en LINQ to SQL? (En vb.net, pero supongo que cualquier ejemplo .Net haría)

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)} 

necesito sumar los .Special y .Magical valores.

(En realidad, la consulta se extiende por varias tablas que consisten en informaciones evento de reserva, y la decisión de resumir un registro o no depende de los campos en varios de ellos)

Respuesta

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

O:

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

Eso es C#, OP está buscando el equivalente de VB.Net. – JaredPar

+1

"En vb.net, pero supongo que cualquier ejemplo de .Net haría" - eso es lo que dijo. Me temo que no hablo VB. –

+0

Además, esto no realiza la unión que hace la consulta sql de OP. – paqogomez

0

recomiendo encarecidamente la primera respuesta

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

La segunda respuesta es mucho más lenta. No sé por qué, pero fue mucho más lento según mis pruebas.