When working with Nullable types, join statement in LINQ need to be handled carefully. When you perform a join over nullable and non-nullable types,
compile time exception is thrown saying that "Type inference failed in the call to join". For example consider following classes.
public class Employee
{
public int EmployeeId
{
get;
set;
}
public string EmployeeName
{
get;
set;
}
}
public class Employee
{
public int EmployeeId
{
get;
set;
}
public string EmployeeName
{
get;
set;
}
}
To fetch data from these let's write code as;
class Test
{
static void Main()
{
var employees = new List<Employee>
{
new Employee
{
EmployeeId = 1,
EmployeeName = "E1",
},
new Employee
{
EmployeeId = 2,
EmployeeName = "E2",
},
new Employee
{
EmployeeId = 3,
EmployeeName = "E3",
},
};
var departments = new List<Department>
{
new Department
{
EmployeeId = 2,
EmployeeName = "E2",
},
new Department
{
EmployeeId = null,
EmployeeName = "D1",
},
new Department
{
EmployeeId = 3,
EmployeeName = "E3",
},
};
var r =
from dept in departments
where dept.EmployeeId != null
join emp in employees
on new { SourceEmployeeID = dept.EmployeeId.Value, SourceEmployeeName = dept.EmployeeName }
equals new { SourceEmployeeID = emp.EmployeeId, SourceEmployeeName = emp.EmployeeName }
select new
{
emp,
dept,
};
foreach (var item in r)
{
Console.WriteLine("{0}", item.emp.EmployeeId);
}
}
}
}
The query highlighted in above code will match the LHS with EmployeeID which is nullable with RHS EmployeeID which is not nullable.