Linq到DataSet

时间:2015-05-27 03:57:23

标签: c# .net asp.net-mvc linq linq-to-sql

我想挑选所有不属于某个部门老板的卖家。

我该怎么做?在下面的查询中,只有部门老板的卖家被选中,我想要与之相反。

我的查询:

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

我想要与这些查询相反。

2 个答案:

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