[英]Left Outer Join - LINQ to Datatable
I'm trying to apply a left outer join using LINQ on two data tables. 我正在尝试在两个数据表上使用LINQ应用左外连接。 I'm receiving the exception listed below when I try to debug and view data contained in result variable:
当我尝试调试并查看结果变量中包含的数据时,我收到下面列出的异常:
System.ArgumentException: Value cannot be null.
System.ArgumentException:值不能为null。 Parameter name: row
参数名称:行
Code: 码:
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"))
};
}
That is because here dtEmpSal
is null (default case if sequence is empty): 这是因为这里
dtEmpSal
为null(如果sequence为空则为默认情况):
from dtEmpSal in outer.DefaultIfEmpty() // dtEmpSal is null
When you are trying to call Field<T>
extension on DataRow
which is null, you get that exception: 当您尝试在
DataRow
上调用Field<T>
扩展名为null时,您将获得该异常:
dtEmpSal.Field<string>("Salary") // System.ArgumentException
Fix it with ternary operator. 用三元运算符修复它。 You was near, but checked wrong value:
你在附近,但检查错误的价值:
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")
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.