【问题标题】:Group by Multiple Columns and Count按多列分组并计数
【发布时间】:2011-03-13 15:23:54
【问题描述】:

我有IEnumerable<DataRow> 形式的Table1 和Table2。这两个表都有Column1Column2 列。

我想对Column1 进行左外连接,并想计算Table2 中存在的行数并将记录加载到数据表中。

我尝试了以下查询

var query = from p in Table1
            join q in Table2 on p.Field<string>("Column1") equals q.Field<string>("Column1") into pq
            from xyz in pq.DefaultIfEmpty()
            group xyz by new { Col1 = p.Field<string>("Column1"), Col2 = p.Field<string>("Column2") } into g
            select dtFinalData.LoadDataRow(new object[]
            {
                g.Key.Col1,
                g.Key.Col2,                               
                g.Count
            }, false);

由于“g”代表分组数据,g.count 为表 2 中没有条目的行返回 1。我想为这些行返回“0”。

输入:

表 1

Col1Val1       Col2Val1

Col1Val2       Col2Val2

表 2

Col1Val1       Col2Val1

Col1Val1       Col2Val1

电流输出:

Col1Val1        Col2Val1    2

Col2Val2        Col2Val2    1

预期结果:

Col1Val1        Col2Val1    2

Col2Val2        Col2Val2    0

我查看了LINQ - Left Join, Group By, and Count,但无法将其应用到我的查询中...

你能帮我解决这个问题吗?

【问题讨论】:

    标签: linq count left-join linq-group


    【解决方案1】:

    let是这样的:

    from p in Table1
    let p1 = p.Field<string>("Column1")
    let p2 = p.Field<string>("Column2") 
    let qs = 
      from q in Table2
      where p1 == q.Field<string>("Column1")
      select q
    let qCount = qs.Count()
    select dtFinalData.LoadDataRow(new object[]
    {
      p1,
      p2,
      qCount
    }, false);
    

    由于我没有加入,所以我不必组队。每个结果行对应Table1中的一行。


    这是一个 GroupJoin 解决方案:

    from p in Table1 
    let pkey = new { c1 = p.Field<string>("Column1"), c2 = p.Field<string>("Column2") }
    join q in Table2 on pkey equals
      new { c1 = q.Field<string>("Column1"), c2 = q.Field<string>("Column2") }
      into qs
    select dtFinalData.LoadDataRow(new object[] 
    { 
      pkey.c1, 
      pkey.c2, 
      qs.Count() 
    }, false); 
    

    这是一个加入和组解决方案。

    from p in Table1 
    let pkey = new { c1 = p.Field<string>("Column1"), c2 = p.Field<string>("Column2") }
    join q in Table2 on pkey equals
      new { c1 = q.Field<string>("Column1"), c2 = q.Field<string>("Column2") }
      into right
    from q in right.DefaultIfEmpty()
    group q by pkey into g
    select dtFinalData.LoadDataRow(new object[] 
    { 
      g.Key.c1, 
      g.Key.c2, 
      g.Count(q => q != null) 
    }, false); 
    

    【讨论】:

    • 谢谢大卫!您的查询有效。我仍然很想知道是否有办法执行类似于以下 SQL 查询的方法 select a.Column1,a.Column2,Count(b.Column1) from table1 a Left outer join table2 b on a.Column1 = b。 Column1 and a.Column2 = b.Column2 group by a.Column1,a.Column2
    • 添加了更多的解决方案...值得注意的是,如果表1中有重复,最后一个解决方案会给出不同的结果。
    • 太棒了!非常感谢大卫。
    猜你喜欢
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2020-02-10
    • 2021-07-07
    • 1970-01-01
    • 2015-11-18
    • 2014-11-05
    相关资源
    最近更新 更多