Linq UNION ALL 在同一个数据表上?
Linq UNION ALL on same DataTable?
我需要对 3 组重复的字段进行合并,我需要将它们全部合并为一个结果,来自:
ID1 | NAME1 | DESC1 | ID2 | NAME2 | DESC2 | ID3 | NAME3 | DESC3
收件人:
ID | NAME | DESC
数据在 C# DataTable 中,如何像 SQL 中那样执行 UNION ALL?
您可以使用 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 }
});
假设你有这些 类:
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()
Concat
in LINQ
等价于 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());
我需要对 3 组重复的字段进行合并,我需要将它们全部合并为一个结果,来自:
ID1 | NAME1 | DESC1 | ID2 | NAME2 | DESC2 | ID3 | NAME3 | DESC3
收件人:
ID | NAME | DESC
数据在 C# DataTable 中,如何像 SQL 中那样执行 UNION ALL?
您可以使用 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 }
});
假设你有这些 类:
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()
Concat
in LINQ
等价于 SQL.
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());