2009-09-18 63 views
5

不知道这是一种坏习惯还是一种行之有效的方式,但对于跨越一堆表的大型复杂报表查询,我总是通过总结Case声明来获得我的总体统计数据。什么是LINQ相当于SUM(CASE当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) 

我将如何做到这一点的LINQ to SQL的? (在vb.net,但我想任何.NET例如会做)

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

我需要总结的.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 2009-09-18 15:25:10

+1

“在vb.net中,但我想任何.Net示例都会做” - 这就是他所说的。恐怕我不会说VB。 – 2009-09-18 15:26:58

+0

另外,这不会执行OP的sql查询所做的连接。 – paqogomez 2015-10-15 22:13:15

0

我强烈建议第一个答案

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

第二个答案要慢得多。根据我的测试,我不知道为什么,但速度要慢得多。

相关问题