我有两个对象,我们称之为 Input
和 Output
Input
的属性 Input_ID
, Label
和 {{1 }}
Input_Amt
包含 Output
和 Output_ID
我想在LINQ中执行等效的SQL语句:
Output_Amt
对于内部查询,我写的是:
SELECT Label, Sum(Added_Amount) as Amount FROM
(SELECT I.Label, I.Input_Amt + ISNULL(O.Output_Amt, 0) as Added_Amount
FROM Input I LEFT OUTER JOIN Output O ON I.Input_ID = O.Output_ID)
GROUP BY Label
然而,在测试中,该语句返回null。是什么赋予了?
此外,如何在一个LINQ语句中添加我的金额后,如何继续所需的查询并执行组?
答案 0 :(得分:5)
好的,既然我明白了什么会好一点,那么主要的问题是你没有得到相当于ISNULL的位。试试这个:
var InnerQuery = from i in input
join o in output
on i.Input_ID equals o.Output_ID into joined
from leftjoin in joined.DefaultIfEmpty()
select new
{
Label = i.Label,
AddedAmount = (i.Input_Amt + (leftjoin == null ? 0 : leftjoin.Output_Amt))
};
答案 1 :(得分:1)
这实际上使用的是哪个LINQ提供商?您实际上是在与数据库交谈,还是只是在进行中?如果您正在使用LINQ to SQL,则可以打开日志以查看正在生成的SQL。
我确信InnerQuery本身不会为null - 你如何检查输出?
答案 2 :(得分:0)
var labelsAndAmounts = input
.GroupJoin
(
output,
i => i.InputId,
o => o.OutputId,
(i, os) => new
{
i,
oAmount = os.Any() ? os.Select(o => o.OutputAmt).Sum() : 0
}
)
.GroupBy(x => x.i.Label)
.Select(g => new
{
Label = g.Key,
Amount = g.Select(x => x.i.InputAmt + x.oAmount).Sum()
}
);