无法将 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)
;
最后一行中的Outcome
是Lot
的字段,由于我正在对IncomingPayment
(group ip...
) 进行分组,因此在g.Sum()
调用中不可用。
我在这里错过了什么?
【问题讨论】:
Outcome 的类型是什么?? 您使用的是什么 ORM?为什么不创建正确的映射并完全避免连接?更好的是,创建一个视图并映射到它。 LINQ 不是 SQL 的替代品,尝试重新创建相同的查询通常会导致痛苦 @EhsanSajjadoutcome
是decimal
。
@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 中的表达式树 [重复]
C# 将带有 Case 语句的 SQL 查询转换为 LINQ
将 SQL 语句转换为 DataTable 上的 LINQ 查询
无法将类型“System.Nullable`1”强制转换为类型“System.Object”。LINQ to Entities 仅支持强制转换 EDM 基元或枚举类型。