如何在LINQ中执行嵌套的Join,Add和Group?

时间:2008-10-31 20:06:59

标签: c# linq

我有两个对象,我们称之为 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语句中添加我的金额后,如何继续所需的查询并执行组?

3 个答案:

答案 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()
    }
  );