2009-09-18 12 views
5

Nie jestem pewien, czy jest to po prostu zły nawyk, czy poprawny sposób robienia rzeczy, ale w przypadku dużych złożonych zapytań z raportami obejmujących paczki tabel, często otrzymuję moje statystyki zbiorcze przez zsumowanie oświadczenia Case.Co to jest LINQ równoważny SUMIE (SPRAWA KIEDY X = Y TO 1 ELSE 0 END)?

Na przykład:

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) 

Jak zrobić to w LINQ do SQL? (W VB.NET, ale myślę, że każdy przykład .Net zrobi)

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

muszę zsumować wartości .Special i .Magical.

(W rzeczywistości, kwerenda obejmuje kilka tabel składających się z informacji o zdarzeniach-rezerwacji i decyzja Podsumowując rekord czy nie zależy na polach w kilku z nich)

Odpowiedz

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

czyli

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

To jest C#, OP szuka odpowiednika VB.Net. – JaredPar

+1

"W vb.net, ale przypuszczam, że zrobiłby to przykład .Net" - tak powiedział. Obawiam się, że nie mówię VB. –

+0

Dodatkowo nie wykonuje połączenia, które wykonuje kwerenda sql OP. – paqogomez

0

Gorąco polecam pierwsza odpowiedź

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

Druga odpowiedź jest znacznie wolniejsza. Nie wiem dlaczego, ale według moich testów było znacznie wolniej.