Использование linq для проверки отсутствия предложения

Вот ситуация, которую я пытался решить

Давайте возьмем таблицу сотрудников

Create Table Employee
(
        Employeeid int primary key,
        EMPname varchar(50),
        ManagerEmplId int reference key Employee (EmployeeID)
         TreeLevel int,
              ....
)

Здесь мне нужно найти всех сотрудников конечного уровня.

Сотрудники конечного уровня - все сотрудники, у которых есть менеджер, но им никто не подчиняется. У меня небольшая помощь от db, в котором есть столбец TreeLevel, где я могу указать кого угодно на уровне 3, но мне нужно предложение UNION, которое предоставит мне всех сотрудников на уровне дерева 2, у которых нет отчетов о сотрудниках. У меня есть только 3 уровня дерева, если это помогает в создании запроса linq.

   return ((from b in _db.Employees
                && b.TreeLevel==3 && b.DeletedDate== null
                    select b)
                    .Union
                    (from b in _db.Employees

                     select b)

                    )
                    .ToDictionary(k => k.EmployeeID, v => v.EMPname);

ОБНОВЛЕНИЕ: Настоящий запрос:

(from fi in firm 
 join bra in _db.Branches on fi.BranchID equals bra.ParentBranchID into g 
 from sc in g.DefaultIfEmpty() 
 where fi.DeletedDate == null && g == null 
 select fi)
 .ToList()
 .ToDictionary(k => k.BranchID, v => v.BranchName);

Ошибка:

Cannot compare elements of type 'System.Collections.Generic.IEnumerable`1'. 
Only primitive types (such as Int32, String, and Guid) and entity types are supported.

person user1147971    schedule 13.01.2012    source источник


Ответы (3)


Вы можете попробовать правое внешнее соединение и убедиться, что левая сторона пуста.

В этом посте Как выполнить полное внешнее соединение в Linq? вы можете найти хороший пример, как это сделать в linq.

from b in _db.Employees
from c in _db.Employees.Where(o=> o.ManagerEmplId == b.Id).DefaultIfEmpty()
where c == null
person Jahan    schedule 13.01.2012
comment
получение исключения, как показано ниже. Невозможно сравнить элементы типа System.Collections.Generic.IEnumerable`1. Поддерживаются только примитивные типы (такие как Int32, String и Guid) и типы сущностей. - person user1147971; 13.01.2012
comment
Вот мой исходный запрос, который я замаскировал с помощью общего, но этот также является простым возвратом (из b в соединении с фирмой в _db.Branches на b.BranchID равно firm.ParentBranchID в g из sc в g.DefaultIfEmpty () где b.DeletedDate == null && g == null выберите b) .ToList () .ToDictionary (k = ›k.BranchID, v =› v.BranchName); Ошибка. Невозможно сравнить элементы типа System.Collections.Generic.IEnumerable`1. Поддерживаются только примитивные типы (такие как Int32, String и Guid) и типы сущностей. - person user1147971; 13.01.2012
comment
return (из b в ‹br/› * присоединиться к фирме в _db.Branches на b.BranchID равно firm.ParentBranchID в ‹br/› * из sc в g.DefaultIfEmpty () ‹br/› * где b.DeletedDate == null && g == null ‹br/› * выберите b) .ToList () ‹br/› * .ToDictionary (k = ›k.BranchID, v =› v.BranchName); ‹br/› * Получение ошибки ‹br / ›* Невозможно сравнить элементы типа 'System.Collections.Generic.IEnumerable`1'. Поддерживаются только примитивные типы (такие как Int32, String и Guid) и типы сущностей. - person user1147971; 13.01.2012
comment
замените g == null на sc == null. - person Jahan; 13.01.2012
comment
как мне отформатировать мои комментарии, которые они выглядят уродливо, я, используя stackoverflow.com/editing-help#comment-formatting - person user1147971; 13.01.2012

Этот запрос должен помочь независимо от глубины дерева:

var leafEmps = 
    (from emp in _db.Employees
     where !_db.Employees.Any(e => e.ManagerEmplId == emp.EmployeeId)
     select emp);
person Nuffin    schedule 13.01.2012

var managersids = _db.Employees.Select(emp => emp.ManagerEmplId ).Distinct();
var leafemps = _db.Employees.where(emp => !managersids.contains(emp.Employeeid));

Чтобы сделать это просто, найдите всех менеджеров, а затем найдите людей, которые не являются менеджерами.

var leafemps = from emp in _db.Employees
               let managersids = _db.Employees.Select(emp => emp.ManagerEmplId ).Distinct()
               where !managersids.contains(emp.Employeeid)
               select emp
person Frederiek    schedule 13.01.2012
comment
При изменении кода в соответствии с предложением я получаю следующую ошибку. В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid). - person user1147971; 13.01.2012
comment
Хорошо, тогда я не мог помочь - person Frederiek; 14.01.2012