1

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

表 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,我想要 20 和 30 的 BID。

对于 3 的援助,我想要 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 表相匹配的对象。

4

1 回答 1

6

对于 LinqToSql,数据库优化器会适当地处理这个问题。使用“Not Any”模式。

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));
于 2008-10-07T17:57:59.803 回答