9

在我的 Linq 中,我正在尝试对可空字段进行内部连接。Employee 和 Department 有关系,Department 可能有一个 EmployeeID 或者可能有一个 null。那么,如果我只想要满足内部联接的记录(空 EmployeeID 没有结果),我的联接将是什么:

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

我遇到了一个例外:

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

谢谢

4

6 回答 6

10

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

var result = from emp in employees
             join dept in departments
             on new { Source = emp.EmployeeID }
             equals new { Source = dept.EmployeeID.Value };
于 2012-07-09T00:15:12.813 回答
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 };
于 2011-09-08T08:20:46.033 回答
6

从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-in​​ference?forum=linqprojectgeneral

要加入多值键,您需要在“等于”的两侧构造一个相同类型的匿名类型。匿名类型初始值设定项表达式从您提供的表达式中推断成员的类型和名称。在您的情况下,成员的名称不同,因此类型最终不同,因此 C# 无法确定两者之间的共同类型。

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

应该

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

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

于 2017-12-17T12:03:56.050 回答
1

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

就像是:

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

Looks like emp.EmployeeIDis of typeintdept.EmployeeIDis of type nullable<int>

于 2013-05-13T18:47:39.480 回答
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}
于 2015-07-20T21:55:26.117 回答
0

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

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 }

我希望它对面临这个问题的人有所帮助。

于 2018-06-28T09:46:56.850 回答