C# Linq联合都在同一个数据表上?

C# Linq联合都在同一个数据表上?,c#,linq,datatable,union-all,C#,Linq,Datatable,Union All,我需要对3组重复的字段进行并集,我需要将它们全部合并到一个结果中: ID1 | NAME1 | DESC1 | ID2 | NAME2 | DESC2 | ID3 | NAME3 | DESC3 致: 数据在一个C#数据表中,如何实现像SQL中那样的联合?您可以使用它为每条记录构建一个包含3项的数组: table.SelectMany(row => new [] { new { ID = row.ID1, NAME = row.NAME

我需要对3组重复的字段进行并集,我需要将它们全部合并到一个结果中:

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

数据在一个C#数据表中,如何实现像SQL中那样的联合?

您可以使用它为每条记录构建一个包含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();
var data=newlist();
var res=data.Select(x=>newlist{
新行{ID=x.ID1,NAME=x.NAME1,DESC=x.DESC1},
新行{ID=x.ID2,NAME=x.NAME2,DESC=x.DESC2},
新行{ID=x.ID3,NAME=x.NAME3,DESC=x.DESC3},
})
.SelectMany(x=>x)
.ToList();

如果您只需要不同的行,那么可以在
LINQ
中使用distinct()
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());

虽然建议的其他方法也可以工作,但这是使用DataTable作为传入DataTypeHow初始化新DataRow对象而不显式提及DataTable对象(例如:dt.NewRow())的最简单方法@艾伦:你能解释一下,在你的情况下,你将如何使用答案的例子吗。
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());