Как выполнить LINQ Outer Join для SubTable? - PullRequest
1 голос
/ 07 октября 2008

У меня есть таблицы данных с таким типом настройки.

Таблица 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 даст мне список B, которого нет в таблице C.

Таким образом, для 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. соответственно.

1 Ответ

6 голосов
/ 07 октября 2008

Для 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...