我想挑选所有不属于某个部门老板的卖家。
我该怎么做?在下面的查询中,只有部门老板的卖家被选中,我想要与之相反。
我的查询:
var query = db.Sellers
.Join(db.Departments,
s => s.Id,
d => d.BossId,
(s, d) => new { Seller = s, Department = d })
.Where(a => a.Seller.Id == a.Department.BossId) ????
.Select(x => x.Seller).ToList();
在" Where"部分,我尝试了a => a.Seller.Id != a.Department.BossId
,但是我错了,我有3个不是老板的卖家。
我也试过这种方式:
var listNonBoss = (from s in db.Sellers
join d in db.Departments on s.Id equals d.BossId
select s.Id).ToList();
我想要与这些查询相反。
答案 0 :(得分:2)
有时,将其分解为多个步骤会更容易。
首先,获取所有老板ID的集合:
var bossIDs = db.Departments.Select(x => x.BossId);
然后获取该集合中ID 的所有卖家:
var listNonBoss = db.Sellers.Where(x => !bossIDs.Contains(x.Id)).ToList();
答案 1 :(得分:1)
Join
会进行内部联接,这意味着它会过滤掉没有老板的卖家。
要做相反的事情,你可以进行外部联接,然后删除那些拥有boss的人。在流畅的LINQ中,通过执行GroupJoin
然后SelectMany
来完成外连接。
这样的事情:
var query = db.Sellers
.GroupJoin(db.Departments, s => s.Id, d => d.BossId, (s, d) => new { Seller = s, Department = d })
.SelectMany(x => x.d.DefaultIfEmpty(), (seller, department) => new { s.seller, department})
.Where(a => a.department.BossId == null)
.Select(x => x.Seller).ToList();
或者,使用查询语法:
var listNonBoss = (from s in db.Sellers
join d in db.Departments on s.Id equals d.BossId into joinedTable
from jt in joinedTable.DefaultIfEmpty()
where jt.BossId == null
select s.Id).ToList();