[英]Left Outer Join - LINQ to Datatable
我正在嘗試在兩個數據表上使用LINQ應用左外連接。 當我嘗試調試並查看結果變量中包含的數據時,我收到下面列出的異常:
System.ArgumentException:值不能為null。 參數名稱:行
碼:
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"))
};
}
這是因為這里dtEmpSal
為null(如果sequence為空則為默認情況):
from dtEmpSal in outer.DefaultIfEmpty() // dtEmpSal is null
當您嘗試在DataRow
上調用Field<T>
擴展名為null時,您將獲得該異常:
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")
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.