C#Linq发现价值

时间:2009-12-11 18:32:12

标签: c# linq

我想通过比较部门表来返回未找到员工表的离开号码。

人员表

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'

4 个答案:

答案 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 IN
var deptIDs = context.Persons
     .Where( p => !context.Depts
             .Select(d => new {DeptID = d.DeptID})
             .Contains( p.DeptID ) 
            )
     .Select( p => new { DeptID = n.DeptID } );