Что такое LINQ, эквивалентный сумме (в случае, когда X = Y THEN 1 ELSE 0 END)? - PullRequest
5 голосов
/ 18 сентября 2009

Не уверен, что это просто дурная привычка или правильный способ ведения дел, но для больших сложных запросов к отчетам, охватывающих кучу таблиц, я часто получаю свою совокупную статистику путем суммирования оператора 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 ]

1 голос
/ 18 сентября 2009
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 голосов
/ 15 июня 2012

Я настоятельно рекомендую первый ответ

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

Второй ответ гораздо медленнее. Я не знаю почему, но по моим тестам это было намного медленнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...