【问题标题】:How to join two tables using group by and do the calculation?如何使用 group by 连接两个表并进行计算?
【发布时间】:2013-11-08 18:28:10
【问题描述】:

我正在尝试使用 linq group by 查找两个表之间的金额差异。 有两个名为 TabA 和 TabB 的表。两个表具有相同的结构和主键。主键是:Curr 和 Dept。

预期结果:

差异 = TabA.Amt- TabB.Amt

我尝试了以下部分代码:

var q = from row in TabA.AsEnumerable().Concat(TabB.AsEnumerable())
        group row by new
        {
               currency = row.Field<String>("Curr"),
               dept = row.Field<String>("Dept")
        }into matches
        select new
        {
               currency = matches.Key.currency,
               dept = matches.Key.dept,
               // diff = Amount Difference
        };

感谢您的解决方案:

【问题讨论】:

    标签: c# linq datatable


    【解决方案1】:
    diff = matches.First().Field<decimal?>("Amt") - 
           matches.Skip(1).First().Field<decimal?>("Amt")
    

    要处理空元素,我们需要遵循一些规则。但是,当 2 个操作数之一(或两者)为空时,上面的代码将使 diff 为空。

    更新

    要将0 用作Amt 的默认值,您可以像这样使用GetValueOrDefault() 方法:

    diff = matches.First().Field<decimal?>("Amt").GetValueOrDefault() - 
           matches.Skip(1).First().Field<decimal?>("Amt").GetValueOrDefault()
    

    【讨论】:

    • Complier(VS 2008) 出现错误。 “System.Data.DataRow”不包含“Amt”的定义
    • 感谢金刚的帮助。我将在我的代码中处理 null 案例
    • @Ullan 不客气,关键是每个组有2个元素,第一个来自tableA,第二个来自tableB(按Concat的顺序)。
    • 感谢 King King,我正在尝试将 null 值处理为 dept = (matches.Key.dept ?? ""),但是在读取 85 条记录后,它会抛出类似“Sequence contains no元素”。实际上,表中存在大约 100 多条记录。
    • @Ullan 不清楚你做了什么。但是我处理空值的意思是tabA.AmttabB.Amt 之一或两者都是null 时,你想要diff 的默认值是多少?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2018-09-11
    相关资源
    最近更新 更多