Left Outer Join con Entity Framework Core

c# entity-framework-core

Domanda

Sto cercando di eseguire una richiesta di join esterno sinistro con EF7 (7.0.0-rc1-final), vNext RC1 (rc1-final) e SQL Server 2014

Banca dati :

Animale domestico: identificazione, nome

Utente: Id, Nome, #PetId

Questo funziona:

var queryWorks = from u in _context.Users
                 join p in _context.Pets on u.PetId equals p.Id into pp
                 from p in pp.DefaultIfEmpty()
                 select new {
                     UserName = u.Name,
                     Pet = p
                 };

ma questo non funziona (Messaggio = "La sequenza non contiene elementi"):

var queryFails = from u in _context.Users
                 join p in _context.Pets on u.PetId equals p.Id into pp
                 from p in pp.DefaultIfEmpty()
                 select new {
                     UserName = u.Name,
                     PetName = (p == null ? "NULL" : p.Name)
                 };

Profilo di SQL Server 2014 mi mostra che la seconda richiesta non viene inviata a SQL Server. Perché ?

Risposta accettata

Penso che sia il tuo p.Name all'interno della proiezione della tua seconda query che non è gestita.

A partire da RC1, EF7 non sa ancora come fare i join esterni a sinistra. In breve, sono consapevoli che è una cosa davvero importante avere ragione e ci stanno lavorando.

È stato segnalato nel numero 3186 su github e alcuni sviluppatori lo hanno commentato.

Mi sono commentato con un'altra repro un po 'come la tua.

Il collaboratore "maumar" osserva:

Il problema è che in Linq (agli oggetti) il concetto di LOJ non esiste da solo.

La soluzione proposta è quella di rappresentare la navigazione opzionale usando la combinazione SelectMany-GroupJoin-DefaultIfEmpty e quindi comprimere questo modello in LOJ nella nostra pipeline relazionale. Il problema è che questo crea query molto più complesse (principalmente a causa dell'introduzione di subquery) e al momento interruzioni per la maggior parte dei casi non banali. Questi bug devono essere risolti prima di poter risolvere il problema con l'espansione delle proprietà di navigazione.

Lo riconosciamo come un bug ad alta priorità, in quanto potenzialmente restituisce risultati errati.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché