Левое соединение 2 таблиц с основной таблицей с использованием LINQ

Это мой запрос в SQL:

Select distinct * from tr.Table1 
Left Outer join tr.Table2 on tr.Table1.ID = tr.Table2.ID
Left Outer join tr.Table3 on tr.Table2.AId= tr.Table3.ID
where tr.Table1.Deleted =1 and tr.Table1.Ready=1 and tr.Table1.Show=0

Запрос работает в SQL и дает ожидаемые результаты. Дело в том, что я хочу эквивалент этого с использованием LINQ. Я пробовал некоторые варианты запросов LINQ, например:

var query = from p in _ctx.Table1
join s in _ctx.Table2 on p.Id equals s.Id into bag1
from to in bag1.DefaultIfEmpty()
join tx in _ctx.Table3 on to.AId equals tx.Id into bag2
from ts in bag2.DefaultIfEmpty()
select new
{
    ContactNo = to.Table1.ContactNo
};

Но он всегда не возвращает все значения поля. Некоторые возвращаются как NULL. Также пытался сослаться на какую-то другую ссылку, но все они сосредоточены на соединении с родительской таблицей, тогда как мне нужно присоединиться к одной из соединенных таблиц с другой. Так вот, я борюсь с этим.

Это результат, который я получаю на данный момент. Некоторые значения являются нулевыми. Поле имеет значения, но из-за некоторых проблем с объединением они возвращаются как NULL.

введите здесь описание изображения

Руководство здесь приветствуется. Спасибо.


person Matt Murdock    schedule 01.01.2015    source источник


Ответы (1)


Ваш запрос выглядит хорошо для меня, причина, по которой вы должны получать Nulls, заключается в том, что когда мы используем DefaultIfEmpty, он возвращает null для несовпадающих строк, поэтому вам нужно обработать это при получении фактических результатов. Попробуйте сделать что-то вроде этого: -

var query = from p in _ctx.Table1
join s in _ctx.Table2 on p.Id equals s.Id into bag1
from to in bag1.DefaultIfEmpty()
join tx in _ctx.Table3 on to.AId equals tx.Id into bag2
from ts in bag2.DefaultIfEmpty()
select new
{
    ContactNo = to == null ? String.Empty  : to.Table1.ContactNo
};

Предполагая, что ContactNo имеет тип String, я использовал String.Empty, вы можете использовать любое значение по умолчанию.

person Rahul Singh    schedule 01.01.2015
comment
Это возвращает записи. Но некоторые ContactNo возвращаются как NULL, для которых нет соответствующих строк соединения. ContactNo существует для каждой записи в Table1. Что я хочу, так это то, что независимо от того, существует ли запись о соединении или нет, contactNo не должен быть нулевым в конце запроса. - person Matt Murdock; 02.01.2015
comment
@iCoder - Можете ли вы добавить пример ввода\вывода? Это сделает это более ясным. - person Rahul Singh; 02.01.2015
comment
@HarveySpecter - Вы только что обновили вывод, без ввода очень сложно ответить, что идет не так, лучше, если вы можете просто показать некоторые образцы данных (3 4 записи подойдут), а не публиковать снимок экрана. - person Rahul Singh; 02.01.2015
comment
Вы указали в правильном направлении. Я только что вспомнил этот вопрос, чтобы сделать это как ответ. Спасибо. Очень признателен. :) - person Matt Murdock; 19.01.2015