Linq to DataTable 左连接

所先创建2个DataTable并对其赋值,来进行模拟.

DataTable dt1 = new DataTable();
dt1.Columns.Add("ID", typeof(int));
dt1.Columns.Add("Name", typeof(string));
dt1.Columns.Add("GradeId", typeof(int));

DataTable dt2 = new DataTable();
dt2.Columns.Add("ID", typeof(int));
dt2.Columns.Add("Name", typeof(string));

for (int i = 0; i < 6; i++)
 {
     DataRow dr1 = dt1.NewRow();
     dr1["ID"] = i + 1;
     dr1["Name"] = "zzq" + (i + 1);
     dr1["GradeId"] = i + 1;
     dt1.Rows.Add(dr1);
}
for (int i = 0; i < 4; i++)
 {
      DataRow dr2 = dt2.NewRow();
      dr2["ID"] = i + 1;
      dr2["Name"] = i + 1 + "班";
      dt2.Rows.Add(dr2);
 }

 

需求大概是这样的。

查询出的数据应该包括(ID,NAME,GradeName)

但有个问题是

b对象和a对象关联查询出来到temp对象中第4条和第5条数据为null.

刚开以为直接取temp的数据就OK了,可是报了值不能为null的错误

 

所以看了一下temp查出来的数据其中4和5查出来的数据为null,这样拿不到需求想要的结果

 

所以在GradeName中加了一个三元表达式的判断,如下代码。

var reslut = (from b in dt1.AsEnumerable()
              join a in dt2.AsEnumerable()
              on new { temp = b.Field<int>("GradeId") } equals new { temp = a.Field<int>("ID") }
              into temp
              from t in temp.DefaultIfEmpty()
              select 
              new {ID=b.Field<int>("ID"),Name=b.Field<string>("Name"),GradeName = t==null?0:t["Name"] }).ToList();

 

最终显示结果:

 

 

亲,帮到您了吗?楼主也刚入行没多久,希望能给刚入行的同学们一点小帮助。

也希望走在前面的前辈们能给些好的建议和意见。 

 

posted @ 2013-10-17 23:30  zqcoder  阅读(4057)  评论(0编辑  收藏  举报