类型推断在对';加入';关于可为null和不可为null的int

本文关键字:null int 加入 类型 于可 | 更新日期: 2023-09-27 18:07:52

在我的Linq中,我试图对一个可为null的字段进行内部联接。员工和部门有关系,部门可能有EmployeeID,也可能有null。那么,如果我只想要满足内部联接的记录(空EmployeeID没有结果(,我的联接会是什么呢:

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

我得到了一个例外:

联接子句中某个表达式的类型不正确。类型推理在对"join"的调用中失败。

感谢

类型推断在对';加入';关于可为null和不可为null的int

要比较Int?和Int,将.Value附加到可为null的属性:

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

如果反转联接并在其中放入一个小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 };

在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

若要联接多值键,您需要在相同类型的"equals"两边构造一个匿名类型。匿名类型初始值设定项表达式从您提供的表达式中推断成员的类型和名称。在您的情况下,成员的名称不同,因此类型最终也不同,因此C#无法找出两者之间的通用类型。

在新{VC.Make,VC.Model}上等于新{MD.MakeID,MD.RefNum}

应该是

在新{VC.Make,CV.Model}上等于新{Make=MD.MakeID,Model=MD.RefNum}

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

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

类似于:

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

看起来emp.EmployeeID属于int类型,而dept.EmployeeID属于nullable<int>类型。

我遇到了同样的问题,我的charge_codes.CompanyId可以为null,但我的order_items.CompanyId不可以为null。

所以我不得不把我的收费代码转换成它们自己的ananomous类型,并使其不可为null。

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}

在我的场景中,我在使用多列的联接中遇到了这个错误。属性名称不同,其中一个属性名称也可以为null。我所做的只是为这些属性创建一个名称,并在可为null的值上添加".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 }

我希望它能帮助任何面临这个问题的人。