Я хочу выполнить левое соединение, которое будет работать так же, как и в sql server / mysql.

Например: mysql: table a LEFT external JOIN tableb ON b.AId = a.bId

Linq:

  from b in ctx.tableb.DefaultIfEmpty()

Я подумал, может быть, добавить это в условии:

  b.Aid = a.bId 

Но затем он возвращает мне результат, как обычное внутреннее соединение.

Если попробовать без него, то в результате я получу все строки из таблицы b с результатом a (повторяющиеся результаты).

Я хочу, чтобы он возвращал строки из таблицы A как обычное левое соединение:

«Ключевое слово LEFT JOIN возвращает все строки из левой таблицы (table1) с совпадающими строками в правой таблице (table2). Результатом является NULL в правой части, когда нет совпадений»

Есть ли способ, которым запрос будет действовать как в mysql?

Если я делаю что-то особенное, проблема решена, но я не думаю, что это так ...

Благодарю.

1
Gal Koren 26 Ноя 2016 в 03:21

2 ответа

Лучший ответ

Из Как выполнить левое внешнее соединение с LINQ вы можете сделать так, чтобы ваш запрос выглядел так:

from b in ctx.tableb                                 
join a in ctx.tablea on b equals tablea.b into ba
from c in ba.DefaultIfEmpty()
select { [ResultFromTableb] = b.[ColumnNameInTableb],..., [ResultFromTablea] = ba = null ? string.Empty : a.[ColumnNameInTablea] }

Обратите внимание, что если вы используете select like

select ba;

, а затем ссылка на столбец из строки выбора, вы получите NullReferenceException для любой строки из ba, которая имеет значение NULL (и вы получите строку NULL, если в ней есть хотя бы один столбец NULL) .

2
αNerd 26 Ноя 2016 в 07:13

Из a в таблице A соединение b в таблице B на a равно b.Owner в gj из c в gj.DefaultIfEmpty () выберите новый {a.FirstName, PetName = (c == null? String.Empty: c.Name)};

-1
kritikaTalwar 26 Ноя 2016 в 08:07