[英]Using linq to check if not exists clause
这是我一直试图解决的情况
让我们拿一个员工表
Create Table Employee
(
Employeeid int primary key,
EMPname varchar(50),
ManagerEmplId int reference key Employee (EmployeeID)
TreeLevel int,
....
)
在这里,我需要找到所有叶子级员工。
一级员工-具有经理但没有任何人向其报告的所有员工。 我从db有TreeLevel列的数据库中获得了一些帮助,我可以在其中指定在3级选择任何人,但是我需要一个UNIONclause,它将使我在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.
无论树的深度如何,此查询都可以解决问题:
var leafEmps =
(from emp in _db.Employees
where !_db.Employees.Any(e => e.ManagerEmplId == emp.EmployeeId)
select emp);
您可以尝试右外部联接,并确保左侧为空。
在这篇文章中, 如何在Linq中进行完全外部联接? 您可以在linq中找到一个很好的例子。
from b in _db.Employees
from c in _db.Employees.Where(o=> o.ManagerEmplId == b.Id).DefaultIfEmpty()
where c == null
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.