无法将 mysql 查询转换为 linq 语句

Posted

技术标签:

【中文标题】无法将 mysql 查询转换为 linq 语句【英文标题】:cannot convert mysql query to linq statement 【发布时间】:2014-06-26 12:47:37 【问题描述】:

按预期工作的我的 SQL 查询:

SELECT SUM(outcome), toaddress
FROM lot l
JOIN incomingpayment ip
ON l.incomingpayment_id = ip.id
WHERE outcome > 0
GROUP BY ip.toaddress
ORDER BY SUM(outcome) DESC

我正在尝试将其转换为 LINQ 语句,但无论如何都没有取得巨大成功:

var result = 

from l in session.Query<Lot>().ToList()
join ip in session.Query<IncomingPayment>().ToList()
on l.IncomingPayment equals ip
where l.Outcome > 0
group ip by new ip.ToAddress
into g
select new

   Address = g.Key,
   SumAmount = g.Sum(x => x.Outcome)
;

最后一行中的OutcomeLot 的字段,由于我正在对IncomingPayment (group ip...) 进行分组,因此在g.Sum() 调用中不可用。

我在这里错过了什么?

【问题讨论】:

Outcome 的类型是什么?? 您使用的是什么 ORM?为什么不创建正确的映射并完全避免连接?更好的是,创建一个视图并映射到它。 LINQ 不是 SQL 的替代品,尝试重新创建相同的查询通常会导致痛苦 @EhsanSajjad outcomedecimal @PanagiotisKanavos 我在 mysql 上使用 NHibernate。域非常复杂,此时我无法更改映射,我将不得不更改数百行代码。我不确定如何创建视图,但感谢您的提示,如果没有找到解决方案,我会检查一下。 创建一个新的映射只有几行——在这种情况下你只需要在两个实体之间添加一个关系,所以你可以写myLot.Payments 【参考方案1】:

你可以试试这个:

var result = from g in (from l in session.Query<Lot>().ToList()
             join ip in session.Query<IncomingPayment>().ToList()
             on l.IncomingPayment equals ip.Id
             where l.Outcome > 0
             select new  Address = ip.ToToAddress, Outcome = l.Outcome)
             group g by g.Address
             select new
             
                 Address = g.Key,
                 SumAmount = g.Sum(x => x.Outcome)
             ;

或者更简洁:

Lots = session.Query<Lot>().ToList();
IncomingPayments = session.Query<IncomingPayment>().ToList();

var result = Lots.Join(IncomingPayments, 
                       x=>x.IncomingPayment,  
                       y=>y.Id,
                       (x,y) => new
                       
                           Address = x.ToToAddress,
                           OutCome = y.Outcome
                       ).GroupBy(x => x.Address, 
                                  x => x.Outcome,
                                  (kew, group) =>
                                  
                                      Address = key,
                                      SumAmount = group.Sum()
                                  );    

【讨论】:

这似乎不起作用。它为g.Sum() 返回“模糊调用”,而x.Outcome 仍然不可用。 @DougPeters 请给我几分钟来纠正它。感谢您的耐心 @DougPeters 请尝试我的更新版本并告诉我。谢谢! 这两个脚本似乎都不起作用,但我还是要为你的努力投赞成票。 @DougPeters 感谢您的支持,但我们的问题是为什么它们不起作用。你收到错误信息了吗?错误消息可以帮助我们找出问题所在...

以上是关于无法将 mysql 查询转换为 linq 语句的主要内容,如果未能解决你的问题,请参考以下文章

带有语句体的 lambda 表达式无法转换为 nopCommerce 中的表达式树 [重复]

查询 (LINQ) 表达式无法转换为实体框架核心

将 SQL 转换为 LINQ 查询

C# 将带有 Case 语句的 SQL 查询转换为 LINQ

将 SQL 语句转换为 DataTable 上的 LINQ 查询

无法将类型“System.Nullable`1”强制转换为类型“System.Object”。LINQ to Entities 仅支持强制转换 EDM 基元或枚举类型。