2008-10-07 3 views
1

У меня есть таблицы данных с этим типом настройки.Как сделать LINQ Outer Join SubTable?

Таблица 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, чтобы написать запрос, который для данного идентификатора дают мне список В, который отсутствует в таблице С.

Так что для AID 1 Я хочу BID 20 & 30.

Для AID 3 Я хочу BID 10

Для AID 2 ничего возвращаемого ничего вернулось.

Я знаю, что 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

A не задан в запросе. A.AID генерирует синтаксическую ошибку. – 2008-10-07 18:00:05

ответ

6

Для LinqToSql оптимизатор баз данных справится с этим соответствующим образом. Используйте шаблон «Не любой».

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

Для LinqToObjects, мы не хотим, чтобы перечислить CList для каждого элемента в Blist. Сделайте это перечисление один раз.

List<int> BIDList = CList 
    .Where(c => c.AID == 1) 
    .Select(c => c.BID) 
    .ToList(); 
IEnumerable<B> query = BList 
    .Where(b => !BIDList.Contains(b.BID)); 
+0

Также ... Молодец! Хорошее решение. – KyleLanser 2008-10-07 18:15:19