2009-09-18 10 views
5

これは単なる悪い習慣であるか、有効なやり方であるかどうかはわかりませんが、大量の複雑なレポートクエリではテーブルの束にまたがって、Case文を合計して集計統計を得ることがよくあります。例えばSUMと同等のLINQ(ケースX = Y THEN 1 ELSE 0 END)は何ですか?

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) 

がどのようにSQLにLINQでこれを行うだろうか?

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

(vb.netでは、私はすべての.NETの例は、どうなると思います)私は.Special.Magical値を合計する必要があります。

(実際には、クエリは、イベント予約情報からなる複数のテーブルにまたがり、そのレコードを合計かどうかの決定は、それらのいくつかのフィールドに依存します)

答えて

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

または:

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

これはC#です.OPはVB.Netに相当するものを探しています。 – JaredPar

+1

「vb.netでは、.Netの例がやっていると思う」と彼は言った。私はVBを話さないのは残念です。 –

+0

さらに、これはOPのSQLクエリが行う結合を実行しません。 – paqogomez

0

は、私は非常に最初の答えをお勧めします

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

2番目の答えはずっと遅いです。なぜか分かりませんが、私のテストによればずっと遅かったです。

関連する問題