【问题标题】:cannot convert mysql query to linq statement无法将 mysql 查询转换为 linq 语句
【发布时间】: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

标签: c# mysql linq linq-to-sql sql-to-linq-conversion


【解决方案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 感谢您的支持,但我们的问题是为什么它们不起作用。你收到错误信息了吗?错误消息可以帮助我们找出问题所在...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多