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

时间:2011-09-08 08:14:01

标签: c# linq entity-framework nullable non-nullable

在我的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子句中某个表达式的类型不正确。   在“加入”调用中,类型推断失败。

由于

6 个答案:

答案 0 :(得分:9)

如果您撤消加入并在其中添加一点where怎么办?

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 };

答案 1 :(得分:8)

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

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

答案 2 :(得分:1)

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

类似的东西:

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

emp.EmployeeID的类型为int,而dept.EmployeeID的类型为nullable<int>

答案 3 :(得分:1)

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

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

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}

答案 4 :(得分:1)

https://social.msdn.microsoft.com/Forums/en-US/bf98ec7a-cb80-4901-8eb2-3aa6636a4fde/linq-join-error-the-type-of-one-of-the-expressions-in-the-join-clause-is-incorrect-type-inference?forum=linqprojectgeneral

的其他链接中找到了有用的答案

要加入多值键,您需要在&#39; equals&#39;的两侧构建一个匿名类型。这是相同的类型。匿名类型初始值设定项表达式从您提供的表达式中推断出成员的类型和名称。在你的情况下,成员的名称是不同的,因此类型最终是不同的,所以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语法,您可以指定编译器在创建类型时使用的名称。如果所有成员类型和&amp;名称是相同的,然后匿名类型是相同的类型。

答案 5 :(得分:0)

在我的场景中,使用多个列的联接出现此错误。属性名称不同,其中之一也可以为空。我所做的就是为这些属性创建一个名称,并在可为空的值上添加“ .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 }

我希望这对遇到此问题的人有帮助。