读书人

多表查询对应的Lambda表达式怎么写呢

发布时间: 2012-12-15 15:16:03 作者: rapoo

多表查询对应的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);



这个Lambda表达式是:
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")


};




不知对应的Lambda表达式如何写呢?
[最优解释]
本帖最后由 q107770540 于 2011-05-10 11:48:48 编辑


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")
};


[其他解释]
GOOD

读书人网 >.NET

热点推荐