我有一个这种类型设置的数据表。
表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表格的对象。
答案 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));