【问题标题】:Linq UNION ALL on same DataTable?Linq UNION ALL 在同一个数据表上?
【发布时间】:2019-01-29 05:56:13
【问题描述】:

我需要对 3 组重复的字段进行联合,我需要将它们全部加入到单个结果中:

ID1  | NAME1  |   DESC1  |   ID2  |   NAME2  |   DESC2  |   ID3  |   NAME3  |   DESC3

收件人:

ID  |  NAME | DESC

数据在 C# DataTable 中,如何像 SQL 中那样做 UNION ALL?

【问题讨论】:

    标签: c# linq datatable union-all


    【解决方案1】:

    您可以使用SelectMany 为每条记录构建一个包含 3 个项目的数组:

    table.SelectMany(row => new []
    {
        new { ID = row.ID1, NAME = row.NAME1, DESC = row.DESC1 },
        new { ID = row.ID2, NAME = row.NAME2, DESC = row.DESC2 },
        new { ID = row.ID3, NAME = row.NAME3, DESC = row.DESC3 }
    });
    

    【讨论】:

    • 虽然建议的其他方法可能有效,但这是使用 DataTable 作为传入 DataType 的最简单方法
    • 如何在不明确提及 DataTable 对象的情况下初始化新的 DataRow 对象(例如:dt.NewRow())。 @Alan 你能解释一下你将如何在你的情况下使用答案示例。
    【解决方案2】:

    假设你有这些类:

    public class Row
    {
        public int ID { get; set; }
        public string NAME { get; set; }
        public string DESC { get; set; }
    }
    public class ComplexRow
    {
        public int ID1 { get; set; }
        public string NAME1 { get; set; }
        public string DESC1 { get; set; }
        public int ID2 { get; set; }
        public string NAME2 { get; set; }
        public string DESC2 { get; set; }
        public int ID3 { get; set; }
        public string NAME3 { get; set; }
        public string DESC3 { get; set; }
    }
    

    你可以这样做:

    var data = new List<ComplexRow>();
    var res = data.Select(x => new List<Row>  {
        new Row{ ID=x.ID1, NAME=x.NAME1,DESC=x.DESC1 },
        new Row{ ID=x.ID2, NAME=x.NAME2,DESC=x.DESC2 },
        new Row{ ID=x.ID3, NAME=x.NAME3,DESC=x.DESC3 },
            })
            .SelectMany(x=>x)
            .ToList();
    

    如果你只需要不同的,你可以使用Distinct()

    【讨论】:

      【解决方案3】:

      LINQ 中的Concat 相当于 SQL 中的 UNION ALL。

      DataTable dt = new DataTable();
      
      dt.Columns.Add(new DataColumn("ID1", typeof(int)));
      
      dt.Columns.Add(new DataColumn("ID2", typeof(int)));
      
      
      DataRow row = dt.NewRow();
      [0] = 1;
      dt.Rows.Add(row);
      
      row = dt.NewRow();
      row[0] = 2;
      dt.Rows.Add(row);
      
      row = dt.NewRow();
      row[0] = 3;
      dt.Rows.Add(row);
      
      row = dt.NewRow();
      row[1] = 1;
      dt.Rows.Add(row);
      
      row = dt.NewRow();
      row[1] = 4;
      dt.Rows.Add(row);
      
      
      var tbl1 = dt.AsEnumerable().Where(t => !t.IsNull("ID1")).CopyToDataTable();
      tbl1.Columns.Remove("ID2");
      tbl1.Columns["ID1"].ColumnName = "ID";
      
      var tbl2 = dt.AsEnumerable().Where(t => !t.IsNull("ID2")).CopyToDataTable();
      tbl2.Columns.Remove("ID1");
      tbl2.Columns["ID2"].ColumnName = "ID";
      
      var query = tbl1.AsEnumerable().Concat(tbl2.AsEnumerable());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-10
        相关资源
        最近更新 更多