如何进行SubTable的LINQ外连接?

时间:2008-10-07 17:44:45

标签: .net linq-to-sql join

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

表A

AID     AName
---------------------
1       A_Name1
2       A_Name2
3       A_Name3

表B

BID     BName
---------------------
10      B_Name1
20      B_Name2
30      B_Name3

表C

AID     BID
---------------------
1       10
2       10
2       20
2       30
3       20
3       30

我想使用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

什么是LINQ等效?

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

1 个答案:

答案 0 :(得分:6)

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

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

对于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));