如何进行SubTable的LINQ外连接?

Dav*_*rab 1 .net join linq-to-sql

我有一个这种类型的设置数据表.

表A.

AID     AName
---------------------
1       A_Name1
2       A_Name2
3       A_Name3
Run Code Online (Sandbox Code Playgroud)

表B.

BID     BName
---------------------
10      B_Name1
20      B_Name2
30      B_Name3
Run Code Online (Sandbox Code Playgroud)

表C.

AID     BID
---------------------
1       10
2       10
2       20
2       30
3       20
3       30
Run Code Online (Sandbox Code Playgroud)

我想使用LINQ编写一个查询,对于给定的A的ID,我给出了不在表C中的B列表.

因此,对于1的AID,我希望BID为20和30.

对于AID为3,我希望BID为10

对于2的AID,没有任何返回任何返回.

我知道SQL会

SELECT
    B.BID
FROM B
LEFT OUTER JOIN C ON C.BID = B.BID AND A.AID = 1 
-- AID would change based on which I was looking for, 1, 2, or 3
Run Code Online (Sandbox Code Playgroud)

什么是LINQ等效?

请假设我有相应的A,B和C表的对象.

Amy*_*y B 6

对于LinqToSql,数据库优化器将适当地处理这个问题.使用"不是任何"模式.

IQueryable<B> query =
  db.BTable
    .Where(b => !db.CTable
      .Where(c=> c.AID == 1)
      .Any(c => c.BID == b.BID)
    )
Run Code Online (Sandbox Code Playgroud)

对于LinqToObjects,我们不想枚举BList中每个项目的CList.做一次枚举.

List<int> BIDList = CList
  .Where(c => c.AID == 1)
  .Select(c => c.BID)
  .ToList();
IEnumerable<B> query = BList
  .Where(b => !BIDList.Contains(b.BID));
Run Code Online (Sandbox Code Playgroud)