2013-06-19 268 views
3

我想在两个数据表上应用使用LINQ的左外连接。当我尝试调试和查看结果变量中包含的数据时,我收到以下异常:左外连接 - LINQ到Datatable

System.ArgumentException:值不能为空。参数名称:排

代码:

private DataTable DataTable1() 
{ 
    DataRow dataRow = null; 
    DataTable dt1 = new DataTable(); 
    dt1.Columns.Add("EmpId"); 
    dt1.Columns.Add("EmpName"); 
    dataRow = dt1.NewRow(); 
    dataRow["EmpId"] = "EMP001"; 
    dataRow["EmpName"] = "Ajaj Kumar"; 
    dt1.Rows.Add(dataRow); 
    dataRow = dt1.NewRow(); 
    dataRow["EmpId"] = "EMP002"; 
    dataRow["EmpName"] = "Sanjay Gupta"; 
    dt1.Rows.Add(dataRow); 
    dataRow = dt1.NewRow(); 
    dataRow["EmpId"] = "EMP003"; 
    dataRow["EmpName"] = "Ashish Charan"; 
    dt1.Rows.Add(dataRow); 
    dt1.AcceptChanges(); 
    return dt1; 
} 

private DataTable DataTable2() 
{ 
    DataRow dr = null; 
    DataTable dt2 = new DataTable(); 
    dt2.Columns.Add("EmpId"); 
    dt2.Columns.Add("Salary"); 
    dr = dt2.NewRow(); 
    dr["EmpId"] = "EMP001"; 
    dr["Salary"] = "50000"; 
    dt2.Rows.Add(dr); 
    dr = dt2.NewRow(); 
    dr["EmpId"] = "EMP002"; 
    dr["Salary"] = "45000"; 
    dt2.Rows.Add(dr); 
    dt2.AcceptChanges(); 
    return dt2; 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    var empInfo = DataTable1().AsEnumerable(); 
    var empSal = DataTable2().AsEnumerable(); 

    var result = from dtEmpRow in empInfo 
      join dtEmpSal in empSal 
      on dtEmpRow.Field<string>("EmpId") equals dtEmpSal.Field<string>("EmpId") 
      into outer 
      from dtEmpSal in outer.DefaultIfEmpty() 
      select new 
      { 
       Id = dtEmpRow.Field<string>("EmpId"), 
       Name = dtEmpRow.Field<string>("EmpName"), 
       Salary = ((dtEmpRow == null) ? "(no salary)" : dtEmpSal.Field<string>("Salary")) 
      }; 
} 

回答

7

那是因为这里dtEmpSal为空(默认情况下,如果序列为空):

from dtEmpSal in outer.DefaultIfEmpty() // dtEmpSal is null 

当你正试图在上拨打Field<T>分机号码这是空,你会得到异常:

dtEmpSal.Field<string>("Salary") // System.ArgumentException 

与三元运营商解决它。您近了,但检查了错误的数值:

from dtEmpRow in empInfo 
join dtEmpSal in empSal 
    on dtEmpRow.Field<string>("EmpId") equals dtEmpSal.Field<string>("EmpId") 
into outer 
from dtEmpSal in outer.DefaultIfEmpty() 
select new 
{ 
    Id = dtEmpRow.Field<string>("EmpId"), 
    Name = dtEmpRow.Field<string>("EmpName"), 
    // here instead of dtEmpRow you should check dtEmpSal 
    Salary = (dtEmpSal == null) ? "(no salary)" : dtEmpSal.Field<string>("Salary") 
}; 
+1

感谢您的快速回复。你的建议解决了这个问题。 –