类型推断在对可空和非可空int的’join’调用中失败

在我的Linq中,我试图将内部联接设置为可以为空的字段。 员工和部门有关系,部门可能有EmployeeID或可能有null。 那么什么是我的连接,如果我只想要满足内连接的记录(没有结果为null EmployeeIDs):

var result = from emp in employees join dept in departments on new { Source = emp.EmployeeID } equals new { Source = dept.EmployeeID }; 

我得到一个例外:

join子句中某个表达式的类型不正确。 在“加入”调用中类型推断失败。

谢谢

如果你改变你的加入并在那里放一点点怎么办?

 var result = from department in departments where department.EmployeeID != null join employee in employees on department.EmployeeID.Value equals employee.EmployeeID select new { employee, department }; 

比较Int? 和Int,将.Value附加到可空属性:

 var result = from emp in employees join dept in departments on new { Source = emp.EmployeeID } equals new { Source = dept.EmployeeID.Value }; 

检查emp.EmployeeIDdept.EmployeeID上的类型。 如果他们不同,你可能会错过演员。

就像是:

 on new { Source = emp.EmployeeID } equals new { Source = **(int)**dept.EmployeeID }; 

看起来emp.EmployeeID的类型为intdept.EmployeeID的类型为nullable

我有同样的问题,我的charge_codes.CompanyId可以为空,但我的order_items.CompanyId不可为空。

所以我不得不把我的收费代码变成他们自己的ananomous类型,并使其不可为空。

 var chargeCodes = from s in db.Charge_Codes where s.CompanyID != null select new { CompanyID = (int)s.CompanyID, Charge_CodeID = s.Charge_CodeID, Revenue_Code_Id = (int)s.Revenue_CodeID, }; //now my chargeCodes contains an anonymous with a non nullable CompanyID and //a non nullable Revenue_CodeID //use chargeCodes here var query = from oi in db.Order_Items join cc in chargeCodes on new {oi.CompanyID, oi.Charge_CodeID} equals new {cc.CompanyID, cc.Charge_CodeID} 

从https://social.msdn.microsoft.com/Forums/en-US/bf98ec7a-cb80-4901-8eb2-3aa6636a4fde/linq-join-error-the-type-of-one-的其他链接中找到了有用的答案。 的最表达式合的联接子句-是-不正确类型的推理?论坛= linqprojectgeneral

要连接多值键,您需要在’equals’两侧构造一个匿名typ,它是相同的类型。 匿名类型初始值设定项表达式从您提供的表达式中推断出成员的类型和名称。 在你的情况下,成员的名称是不同的,因此类型最终是不同的,所以C#无法找出两者之间的共同类型。

on new {VC.Make,VC.Model}等于new {MD.MakeID,MD.RefNum}

应该

on new {VC.Make,CV.Model}等于new {Make = MD.MakeID,Model = MD.RefNum}

使用初始值设定项中的name = value语法,您可以指定编译器在创建类型时使用的名称。 如果所有成员类型和名称相同,则匿名类型是相同类型。

在我的场景中,我在使用多列的连接上出现此错误。 属性名称不同,其中一个也可以为空。 我所做的就是为这些属性创建一个名称,并在可空值上添加“.Value”,以便LINQ Join可以正确地关联这些属性。

 var query = from y in Context.Table1 join y in Context.Table2 on new { Field1 = x.Field1.Value, Field2 = x.Field2 } equals new { Field1 = y.Field1DiffName, Field2 = y.Field2 } 

我希望它可以帮助那些面临这个问题的人。