Linq 到数据集

Linq to DataSet

我想接所有不是部门老板的卖家。

我该怎么做?在下面的这个查询中,只挑选了作为部门老板的卖家,我想要相反的。

我的查询:

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();

我想要这些查询的反面。

Join 在您的代码中将执行内部联接,这意味着它将过滤掉没有老板的卖家。

相反,你可以做一个外部连接,然后删除那些有老板的人。在流利的 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();

有时将其分成多个步骤会更容易。

首先获取所有boss ID的集合:

var bossIDs = db.Departments.Select(x => x.BossId);

然后获取该集合中所有 ID 为 not 的卖家:

var listNonBoss = db.Sellers.Where(x => !bossIDs.Contains(x.Id)).ToList();