我想通过比较部门表来返回未找到员工表的离开号码。
人员表
ID name salary job commision DeptID
--------------------------------------------------------------
P001 Jon 2000 Manager NULL 1
P002 Skeet 1000 Salesman 2000 1
P003 James 2340 Developer NULL 2
P004 greed 4500 Developer NULL 2
P005 Joel 1330 Salesman 1200 1
P006 Deol 5000 Architect NULL 2
部门表
DeptID DeptName
1 Management
2 Software
3 ERP
SQL
select DeptId from dept
where deptId not in (select deptid from person)
当我尝试执行以下代码时
LINQ
var qry = from n in context.Persons
where n.DeptID !=
(from m in context.Depts select m.DeptId)
select new { DeptID = n.DeptID };
我收到以下错误
运算符'!='不能应用于'int?'类型的操作数和'System.Linq.IQueryable'
答案 0 :(得分:3)
var qry = from n in context.Persons
where n.DeptID !=
(from m in context.Depts select m.DeptId).FirstOrDefault()
select new { DeptID = n.DeptID };
您正在尝试将DeptID与集合1或更多部门ID进行比较。即使逻辑上只有一个DeptID的结果,从语法上来说你需要指定你想要的第一个命中。
答案 1 :(得分:2)
听起来SQL中的DeptID字段设置为允许空值。在这种情况下,你可能想要一些类似的东西:
var qry = from n in context.Persons
where n.DeptID.Value !=
(from m in context.Depts select m.DeptId)
select new { DeptID = n.DeptID.Value };
答案 2 :(得分:2)
建议改述:
var q = from m in context.Depts
where
!context.Persons.Select(p => p.DeptID).Contains(m.DeptID)
select new { DeptID = m.DeptID };
答案 3 :(得分:1)
我认为它应该是那样的。我试图首先获得DeptID的列表,然后使用contains:
实现NOT INvar deptIDs = context.Persons
.Where( p => !context.Depts
.Select(d => new {DeptID = d.DeptID})
.Contains( p.DeptID )
)
.Select( p => new { DeptID = n.DeptID } );