Linq-to-Sql СЛЕВА НАРУЖНОЕ СОЕДИНЕНИЕ между 2 отдельными ВНУТРЕННИМИ СОЕДИНЕНИЯМИ - PullRequest
0 голосов
/ 21 мая 2018

Попытка сгенерировать следующий SQL из Linq-To-Sql

SELECT 
parenttableA.Name AS parentA,
childtableA.Name AS childA,
parenttableB.Name AS parentB,
childtableB.Name AS childB

FROM parenttableA
INNER JOIN childtableA ON childtableA.parentid = parenttableA.id

LEFT OUTER JOIN

(
parenttableB
INNER JOIN childtableB ON childtableB.parentid = parenttableB.id
)

ON parenttableB.townid = parenttableA.townid

WHERE parenttableA.townid = 123

Этот SQL должен возвращать что-то вроде:

parentA    childA    parentB    childB
=======    ======    =======    ======
John       Dave      Paul       Mark
Jim        John      (null)     (null)

Итак, другими словами:

Как я могу иметь 2 отдельных внутренних соединения, связанных вместе с ЛЕВЫМ ВНЕШНИМ СОЕДИНЕНИЕМ, чтобы я все еще получал записи "A" из города 123, даже если для этого города не существует записей "B"?

1 Ответ

0 голосов
/ 21 мая 2018

Это должно работать для IQueriable для перечислимых, вы должны добавить нулевые проверки

var query = from ptA in parenttableA
                        join ctA in childtableA on ptA.Id equals ctA.Id
                        join ptBctB in (from ptB in parenttableB
                                        join ctB in childtableB on ptB.Id equals ctB.Id
                                        select new { ptB, ctB }) on ptA.TownId equals ptBctB.ptB.TownId into ptBGroup
                        from ptBctBLeft in ptBGroup.DefaultIfEmpty()
                        where ptA.TownId == 123
                        select new
                        {
                            parentA = ptA.Name,
                            childA = ctA.Name,
                            parentB = ptBctBLeft.ptB.Name,
                            childB = ptBctBLeft.ctB.Name,
                        };

Также я думаю, что вы можете сделать это с помощью просто сопоставления конфигурации и иметь это как свойство в вашем POCO, но вам нужно опубликоватьEF config для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...