Вернуть несколько агрегированных столбцов в LINQ - PullRequest
8 голосов
/ 01 сентября 2011

Я хотел бы перевести следующий SQL в LINQ:

SELECT
    (Select count(BidID)) as TotalBidNum,
    (Select sum(Amount)) as TotalBidVal
FROM Bids

Я пробовал это:

from b in _dataContext.Bids
select new { TotalBidVal = b.Sum(p => p.Amount), TotalBidNum = b.Count(p => p.BidId) }

, но получаю сообщение об ошибке "Ставки не содержат определения для«Сумма» и метод расширения «Сумма», принимающий первый аргумент типа «Ставки», могут быть найдены.

Как я могу сделать это в LINQ?

Спасибо

ЗАКЛЮЧИТЕЛЬНЫЙ:

Окончательный ответ был:

var ctx = _dataContext.Bids;

var itemsBid = (from b in _dataContext.Bids
               select new { TotalBidVal = ctx.Sum(p => p.Amount), TotalBidNum = ctx.Count() }).First();

Ответы [ 4 ]

19 голосов
/ 26 августа 2013

Вы можете написать этот запрос, используя GroupBy. Лямбда-выражение выглядит следующим образом:

    var itemsBid = db.Bids
                     .GroupBy( i => 1)
                     .Select( g => new
                     {
                          TotalBidVal = g.Sum(item => item.Amount), 
                          TotalBidNum = g.Count(item => item.BidId)
                     });
6 голосов
/ 01 сентября 2011

Вы можете попробовать это.Переменная b - это сущность (для каждой итерации), а ctx - это сущность, в которой есть нужные вам методы расширения.

var ctx = _dataContext.Bids;

var result = ctx.Select(x => new {TotalBidVal = ctx.Sum(p => p.Amount),TotalBidNum = ctx.Count(p => p.BidId)}).First();
1 голос
/ 01 сентября 2011

вот альтернатива решению скартага:

(from b in _dataContext.Bids.Take(1)
select new 
{
    TotalBidVal = _dataContext.Bids.Sum(p => p.Amount), 
    TotalBidNum = _dataContext.Bids.Count()
}).Single();

Хотя нет реальной причины, по которой вы не можете просто сказать:

var result = new 
{
    TotalBidVal = _dataContext.Bids.Sum(p => p.Amount), 
    TotalBidNum = _dataContext.Bids.Count()
};

Дважды попадает в базу данных, но очень хорошо читается

0 голосов
/ 30 августа 2016

Вы можете сделать это, используя Aggregate Clause .

Aggregate t In _dataContext.Bids
Into TotalBidNum = Count(BidID),
     TotalBidVal = Sum(Amount)

Если вы используете Fx4 + или расширение dll для Fx2, вы также можете извлечь выгоду из параллелизма, используя

Aggregate t In _dataContext.Bids.AsParallel
...