在LINQ中返回多个聚合列

时间:2011-08-31 23:45:08

标签: linq-to-sql aggregate

我想将以下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) }

但是得到一个错误“Bids不包含”Sum“的定义,并且没有扩展方法”Sum“接受类型为”Bids“的第一个参数。

如何在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 个答案:

答案 0 :(得分:19)

您可以使用GroupBy编写此查询。 Lambda表达式如下:

    var itemsBid = db.Bids
                     .GroupBy( i => 1)
                     .Select( g => new
                     {
                          TotalBidVal = g.Sum(item => item.Amount), 
                          TotalBidNum = g.Count(item => item.BidId)
                     });

答案 1 :(得分:6)

你可以尝试一下。变量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();

答案 2 :(得分:1)

这是scartag解决方案的替代方案:

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

它击中数据库两次,但它非常易读

答案 3 :(得分:0)

您可以使用Aggregate Clause

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

如果你为Fx2使用Fx4 +或扩展dll,你也可以使用

来兼顾并行性
Aggregate t In _dataContext.Bids.AsParallel