首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2012-12-15 
多表查询对应的Lambda表达式如何写呢?现在有个问题,想解决动态根据所选字段,关联两表查询但事先两表的结构

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

热点排行