//Create DataTable
DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("Name");
dt.Columns.Add("city");
dt.Rows.Add("1","李","北京");
dt.Rows.Add("2", "李", "北京");
dt.Rows.Add("3", "李", "北京");
DataTable dt1 = new DataTable();
dt1.Columns.Add("id");
dt1.Columns.Add("Name");
dt1.Columns.Add("city");
dt1.Rows.Add("1", "张", "上海");
dt1.Rows.Add("2", "张", "上海");
dt1.Rows.Add("4", "张", "上海");
1. 内连接查询
//内连接查询
var result = from getdt in dt.AsEnumerable()
join getdt1 in dt1.AsEnumerable() on getdt.Field<string>("id") equals getdt1.Field<string>("id")
select new
{ id=getdt.Field<string>("id"),
name=getdt.Field<string>("name"),
city=getdt1.Field<string>("city")
};
DataTable dc = dt.Clone();
//将内连接查询的结果数据填充到dc表中
result.ToList().ForEach(q=>dc.Rows.Add(q.id,q.name,q.city));
执行完上面的代码,表dc中的数据如下图:
和预想的结果相同。
2. 左连接查询
var resultleftjoin = from getdt in dt.AsEnumerable()
join getdt1 in dt1.AsEnumerable() on getdt.Field<string>("id") equals getdt1.Field<string>("id") into corr
from getdt2 in corr.DefaultIfEmpty()
select new
{ id = getdt.Field<string>("id"),
name1 = getdt.Field<string>("name"),
name2 = getdt2==null? null : getdt2.Field<string>("name"),
city1 = getdt.Field<string>("city"),
city2 = getdt2 == null ? null : getdt2.Field<string>("city")
};
DataTable leftTable = new DataTable();
leftTable.TableName = "leftTable";
leftTable.Columns.Add("id");
leftTable.Columns.Add("name1");
leftTable.Columns.Add("name2");
leftTable.Columns.Add("city1");
leftTable.Columns.Add("city2");
//将查询结果填充至DataTable中
resultleftjoin.ToList().ForEach(q=> leftTable.Rows.Add(q.id,q.name1,q.name2,q.city1,q.city2));
结果如图:
结果和预想相同。
3. 右连接查询
右连接查询和左连接查询的逻辑是互通的。左连接查询是保留from的第一个表的所有数据,右连接查询是保留join后的第一个表的所有数据,当join后的第一个表和from后的第一个表互换,即将右连接查询转换为了左连接查询。
以‘2.右连接查询’中的数据为例:保留了Getdt(即dt表)中的所有数据,要想实现保留Getdt1(即dt2表)中所有的数据,即将dt和dt1调换位置即可。
var resultrightjoin = from getdt in dt1.AsEnumerable()
join getdt1 in dt.AsEnumerable() on getdt.Field<string>("id") equals getdt1.Field<string>("id") into corr
from getdt2 in corr.DefaultIfEmpty()
select new
{
id = getdt.Field<string>("id"),
name1 = getdt2 == null ? null : getdt2.Field<string>("name"),
name2 = getdt.Field<string>("name"),
city1 = getdt2 == null ? null : getdt2.Field<string>("city"),
city2 =getdt.Field<string>("city")
};
DataTable rightTable = new DataTable();
rightTable.TableName = "rightTable";
rightTable.Columns.Add("id");
rightTable.Columns.Add("name1");
rightTable.Columns.Add("name2");
rightTable.Columns.Add("city1");
rightTable.Columns.Add("city2");
resultrightjoin.ToList().ForEach(q => rightTable.Rows.Add(q.id, q.name1, q.name2, q.city1, q.city2));
结果如下:
结果和预想相同。