Try with below code:
DataTable dt = new DataTable();
DataRow dr = null;
dt.TableName = "Emp";
dt.Columns.Add("EmpName", typeof(string));
dr = dt.NewRow();
dr["EmpName"] = "Name1";
dt.Rows.Add(dr);
DataRow dr1 = null;
dr1 = dt.NewRow();
dr1["EmpName"] = "Name2";
dt.Rows.Add(dr1);
DataRow dr2 = null;
dr2 = dt.NewRow();
dr2["EmpName"] = "Name3";
dt.Rows.Add(dr2);
DataRow dr3 = null;
dr3 = dt.NewRow();
dr3["EmpName"] = "Name4";
dt.Rows.Add(dr3);
DataRow dr4 = null;
dr4 = dt.NewRow();
dr4["EmpName"] = "Name5";
dt.Rows.Add(dr4);
DataTable dt2 = new DataTable();
dt2.TableName = "EmpGrade";
dt2.Columns.Add("EmpName", typeof(string));
dt2.Columns.Add("Grade", typeof(int));
DataRow drgrade = null;
drgrade = dt2.NewRow();
drgrade["EmpName"] = "Name1";
drgrade["Grade"] = 2;
dt2.Rows.Add(drgrade);
DataRow drgrade1 = null;
drgrade1 = dt2.NewRow();
drgrade1["EmpName"] = "Name2";
drgrade1["Grade"] = 2;
dt2.Rows.Add(drgrade1);
DataRow drgrade2 = null;
drgrade2 = dt2.NewRow();
drgrade2["EmpName"] = "Name3";
drgrade2["Grade"] = 2;
dt2.Rows.Add(drgrade2);
DataRow drgrade3 = null;
drgrade3 = dt2.NewRow();
drgrade3["EmpName"] = "Name4";
drgrade3["Grade"] = 5;
dt2.Rows.Add(drgrade3);
var JoinResult = (from p in dt.AsEnumerable()
join t in dt2.AsEnumerable()
on p.Field<string>("EmpName") equals t.Field<string>("EmpName") into tempJoin
from leftJoin in tempJoin.DefaultIfEmpty()
select new
{
EmpName = p.Field<string>("EmpName"),
Grade = leftJoin == null ? 0 : leftJoin.Field<int>("Grade")
}).ToList();