Search code examples
c#linqjoinlinq-to-sqlentity-framework-4

The type of one of the expressions in the join clause is incorrect. Type inference failed in the call to 'Join'.- Linq JOIN with multiple condition


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.

enter image description here


Solution

  • 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.

                        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 = scr.CompanyID, Station= scr.StationID }
    

    So, while writing linq to join tables with multiple condition on ON clause:-

    You must match the property names and you must handle for nullable values if one propertiy from one table is nullable whilst the other one is not null.