什么是LINQ相当于SUM(当X = Y那么1 ELSE 0 END时)?

时间:2009-09-18 15:17:55

标签: vb.net linq-to-sql

不确定这只是一个坏习惯,还是一种有效的做事方式,但是对于跨越一堆表的大型复杂报表查询,我经常通过汇总Case语句得到我的汇总统计数据。

例如:

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值相加。

(实际上,查询跨越了几个由事件预订信息组成的表,并且决定是否对记录求和取决于其中几个字段的字段)

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:0)

我强烈推荐第一个答案

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

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