2009-12-11 1 views
1

Я хочу вернуть номер отправления, который не найден. Таблица сотрудников, сравнивая таблицу Департамента.C# Linq find value

Person Таблица

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'

ответ

2

Предложенная перефразировка:

var q = from m in context.Depts 
     where 
     !context.Persons.Select(p => p.DeptID).Contains(m.DeptID) 
     select new { DeptID = m.DeptID }; 
2

Звучит так, что в поле DeptID в SQL задано значение null. В этом случае вы, вероятно, хотите что-то вдоль линий этого:

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 }; 
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 или более отдела идентификаторами. Даже если логически будет только один результат для DeptID, синтаксически вам нужно указать, что вы хотите получить первый хит.

+1

Этого вопроса будет, однако, не делать то, что ОП просили, он будет взять первую строку из таблицы Depts, и вернуть все deptsIDs из строки Лица, которые отличаются от первого. Таблицы следует обменивать в вопросе. –

+0

Хорошее наблюдение. Я больше сосредоточился на исключении, чем на вопросе. – kwcto

1

Я думаю, что это должно быть что-то в этом роде. Я пытался получить список DeptID сначала, а затем реализовать 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 });