使用Lambda表达式以及Join、GroupBy、Count和Sum将Linq转换为SQL

使用Lambda表达式以及Join、GroupBy、Count和Sum将Linq转换为SQL,sql,linq,join,lambda,count,Sql,Linq,Join,Lambda,Count,我使用此SQL语句获得我想要的: select count(o.Id) as order_amount, sum(r.Price) as Total_ordersum from Orders o join OrderRows r on o.Id = r.OrderId; 我尝试使用Linq lambda表达式来获得相同的结果: Orders .Join(OrderRows, o => o.Id, r => r.OrderId, (o,r) => new {o,

我使用此SQL语句获得我想要的:

select count(o.Id) as order_amount, sum(r.Price) as Total_ordersum from Orders o join OrderRows r on o.Id = r.OrderId;
我尝试使用Linq lambda表达式来获得相同的结果:

Orders
        .Join(OrderRows, o => o.Id, r => r.OrderId, (o,r) => new {o,r})
        .GroupBy(g => new {g.o.Id, g.r.Price})
        .Select(group => new {
            order_amount = group.Count(), 
            Total_ordersum  = group.Key.Price,
        });´
但我得到了三行,而不是一行的订单总额和所有订单的总和。我做错了什么

我做错了什么

LINQ和SQL查询是不等价的。您的SQL查询没有
分组依据
,而LINQ查询没有按订单
Id
分组和记录
价格
,这当然会产生不同的结果。此外,SQL查询对记录
Price
求和,而LINQ查询不求和

通过使用一种异常的
groupby
常量运算符,可以在LINQ中获得相同的结果:

var query = Orders
    .Join(OrderRows, o => o.Id, r => r.OrderId, (o, r) => new { o, r })
    .GroupBy(g => 0) // any constant would work
    .Select(g => new
    {
        order_amount = g.Count(), 
        Total_ordersum  = g.Sum(e => e.r.Price),
    });

谢谢你,伊万!但它所说的GroupBy(g=>0)是什么意思呢?您不应该在lambda表达式中使用声明的变量吗?@HabilKantur实际上不是。有些人使用
\uu
来表示未使用的lambda参数,如
GroupBy(\u=>0)