2009-09-18 7 views
5

Bunun sadece kötü bir alışkanlık mı, yoksa geçerli bir yöntem yapıp yapmadığına, ancak tabloların genişliğine ilişkin büyük karmaşık rapor sorguları için sık sık toplu istatistiklerimi aldığımdan, bir Case bildirimini toplayarak elde ederim.SIN'e LINQ eşdeğeri nedir (CASE WHEN X = Y SON 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) 

nasıl LINQ to SQL bu yapardın: Örneğin

? Ben .Special ve .Magical değerleri toplamak gerekir

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 olarak, ama herhangi bir .Net örnek yapacağını tahmin).

(Gerçekte, sorgu pek çok olay rezervasyon bilgilerinden oluşan tablolar ve rekor toplamak kararı yayılıyorsa veya onlardan birkaç alanların bağlıdır)

cevap

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

Veya:

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

Bu C#, OP, VB.Net eşdeğerini arıyor. – JaredPar

+1

".net.net'de, ama sanırım herhangi bir .NET örneğini yapacak" - dedi. Korkarım ben VB konuşamıyorum. –

+0

Ayrıca, bu OP'nin sql sorgusunun yaptığı birleştirme gerçekleştirmez. – paqogomez

0

ederim ilk cevabı tavsiye

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

İkinci cevap çok daha yavaş. Nedenini bilmiyorum ama testlerime göre çok daha yavaştı.

İlgili konular