我想将以下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();
答案 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