Использование linq для проверки, если не существует - PullRequest
4 голосов
/ 13 января 2012

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

Давайте возьмем таблицу Employee

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

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

Сотрудники конечного уровня - все сотрудники, у которых есть менеджер, но никто не отчитывается перед ними. У меня есть небольшая помощь от базы данных, в которой есть столбец 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);

UPDATE: Реальный запрос:

(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.

Ответы [ 3 ]

1 голос
/ 13 января 2012

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

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

from b in _db.Employees
from c in _db.Employees.Where(o=> o.ManagerEmplId == b.Id).DefaultIfEmpty()
where c == null
1 голос
/ 13 января 2012

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

var leafEmps = 
    (from emp in _db.Employees
     where !_db.Employees.Any(e => e.ManagerEmplId == emp.EmployeeId)
     select emp);
0 голосов
/ 13 января 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
...