多表查询对应的Lambda表达式如何写呢?
现在有个问题,想解决动态根据所选字段,关联两表查询
但事先两表的结构是不知道的,只是知道所选字段一定存在
两表如下:
DataTable dt_A = new DataTable();
dt_A.Columns.Add("Name", typeof(string));
dt_A.Columns.Add("Age", typeof(int));
DataTable dt_B = new DataTable();
dt_B.Columns.Add("Name", typeof(string));
dt_B.Columns.Add("Age", typeof(int));
dt_A.Rows.Add("Kitty", 12);
dt_A.Rows.Add("Tom", 24);
dt_A.Rows.Add("Kelly", 22);
dt_B.Rows.Add("Kitty", 12);
dt_B.Rows.Add("Tom", 27);
dt_B.Rows.Add("Jhon", 22);
var singleQuery = dt_A.AsEnumerable().Where(stu => stu.Field<int>("Age") > 20).Select(stu => stu);
stu => stu.Field<int>("Age") > 20
var doubleQuery = from a in dt_A.AsEnumerable()
from b in dt_B.AsEnumerable()
where a.Field<string>("Name") == b.Field<string>("Name") &&
a.Field<int>("Age") != b.Field<int>("Age")
select new
{
Name = a.Field<string>("Name"),
A_Age = a.Field<int>("Age"),
B_Age = b.Field<int>("Age")
};
var doubleQuery = from a in dt_A.AsEnumerable()
join b in dt_B.AsEnumerable()
on a.Field<string>("Name") equals b.Field<string>("Name")
where a.Field<int>("Age") != b.Field<int>("Age")
select new
{
Name = a.Field<string>("Name"),
A_Age = a.Field<int>("Age"),
B_Age = b.Field<int>("Age")
};
var query=dt_A.AsEnumerable()
.Join (
dt_B.AsEnumerable(),
a => a.Field<string>("Name") ,
b => b.Field<string>("Name") ,
(a, b) => new
{
a=a,
b=b
}
)
.Where(temp0=>(temp0.a.Field<int>("Age") != temp0.b.Field<int>("Age")))
.Select(
temp0=>new
{
Name = temp0.a.Field<string>("Name"),
A_Age = temp0.a.Field<int>("Age"),
B_Age = temp0.b.Field<int>("Age")
}
);
void Main()
{
DataTable dt_A = new DataTable();
dt_A.Columns.Add("Name", typeof(string));
dt_A.Columns.Add("Age", typeof(int));
DataTable dt_B = new DataTable();
dt_B.Columns.Add("Name", typeof(string));
dt_B.Columns.Add("Age", typeof(int));
dt_A.Rows.Add("Kitty", 12);
dt_A.Rows.Add("Tom", 24);
dt_A.Rows.Add("Kelly", 22);
dt_B.Rows.Add("Kitty", 12);
dt_B.Rows.Add("Tom", 27);
dt_B.Rows.Add("Jhon", 22);
var query=dt_A.AsEnumerable()
.Join (
dt_B.AsEnumerable(),
a => a.Field<string>("Name") ,
b => b.Field<string>("Name") ,
(a, b) => new
{
a=a,
b=b
}
)
.Where(temp0=>(temp0.a.Field<int>("Age") != temp0.b.Field<int>("Age")))
.Select(
temp0=>new
{
Name = temp0.a.Field<string>("Name"),
A_Age = temp0.a.Field<int>("Age"),
B_Age = temp0.b.Field<int>("Age")
}
);
foreach(var q in query)
{
Console.WriteLine(string.Format("Name:{0}\tA_Age:{1}\tB_BAge:{2}",q.Name,q.A_Age,q.B_Age));
}
//Name:TomA_Age:24B_BAge:27
}
//我个人比较推荐你这种写法
//用LAMBDA表达式反而不利于他人阅读代码
var query = from a in dt_A.AsEnumerable()
join b in dt_B.AsEnumerable()
on a.Field<string>("Name") equals b.Field<string>("Name")
where a.Field<int>("Age") != b.Field<int>("Age")
select new
{
Name = a.Field<string>("Name"),
A_Age = a.Field<int>("Age"),
B_Age = b.Field<int>("Age")
};