This might get closed for a possible duplicate of this: The type of one of the expressions in the join clause is incorrect in Entity Framework But I would request to not close this without reading this whole problem.
Although it might seem to be a duplicate question, I would request to give this a read and help if possible. I have seen the solutions to the same question I linked, it is described that the property type and the name must match. I carefully read the solutions over there and made sure mine was following each of them.
However, I could not find any property type and name mismatch error in my code. So I am guessing there is something else that I am missing. Hence looking for help creating a separate question.
So I am trying to write LINQ Join with Multiple Conditions in On Clause. I have written them making sure the object's properties are of same type and name. Nevertheless I am getting the infamous misleading error - The type of one of the expressions in the join clause is incorrect. Type inference failed in the call to 'Join'.
Following is my code:
results = from i in context.Invoices.AsNoTracking()
join iwr in context.InvoiceWorkOrderRelations on i.ID equals iwr.InvoiceId
join w in context.WorkOrders on iwr.WorkOrderId equals w.ID
join scr in context.StationCompanyRelations
on new { Company = w.CompanyID ?? -1, Station = w.RepairLocation ?? -1 } equals new { Comapny = (int)?scr.CompanyID, Station= (int)?scr.StationID }
where i.IsDeleted == false
&& (companyID == Company.SYSTEMCOMPANYID || i.CompanyId == companyID)
orderby i.ID descending
select new DTO.InvoiceQuickView
{
ID = i.ID,
....
ShopCode = scr.ShopCode
};
CompanyID and RepairLocation from WorkOrders context both are of type int?, hence, I type casted the relation table and stringly provided names for each property just to make sure.
Also to handle null values, I added w.CompanyID ?? -1. The error remains with or without this null checking.

Well after a lot of trying and searching I found the solution. Thanks to @Meysam Asadi who brought a point about typecasting the anonymous types inside linq, but to add to that statement type names must also match. I found out the issue with his solution was the second property of both object (RepairLocation and StationID) are not same and that's why compiler was still throwing the same error.
I don't know why the other solutions were sugesting typecasting though. In my case it is the typecasting that was mainly causing this error.
So, while writing linq to join tables with multiple condition on
ONclause:-You must match the property names and you must handle for nullable values if one propertiy from one table is
nullablewhilst the other one isnot null.