146 votes

LINQ to SQL Jointure externe gauche

Est cette requête équivalente à une `` join ?

228voto

Amir Points 5816

Vous n'avez pas besoin des déclarations into:



var query = 
    from customer in dc.Customers
    from order 
    in dc.Orders
         .Where(o => customer.CustomerId == o.CustomerId)
         .DefaultIfEmpty()
    select new { Customer = customer, Order = order } 
    //Order will be null if the left join is null
 

Et oui, la requête ci-dessus crée effectivement une jointure LEFT OUTER.

Lien vers une question similaire qui traite plusieurs jointures à gauche: Linq to Sql: plusieurs jointures externes à gauche

175voto

Marc Gravell Points 482669

Pas tout à fait, car chaque ligne "gauche" dans une jointure externe gauche correspondra à 0-n lignes "droite" (dans le second tableau), où-comme vous correspondez seulement 0-1. Pour faire une jointure externe gauche, vous avez besoin de SelectMany et DefaultIfEmpty , par exemple:

 var query = from c in db.Customers
            join o in db.Orders
               on c.CustomerID equals o.CustomerID into sr
            from x in sr.DefaultIfEmpty()
            select new {
               CustomerID= c.CustomerID, ContactName=c.ContactName,
               OrderID = x.OrderID == null ? -1 : x.OrderID};   
 

( ou via les méthodes d'extension )

13voto

 Public Sub LinqToSqlJoin07()
Dim q = From e In db.Employees _
        Group Join o In db.Orders On e Equals o.Employee Into ords = Group _
        From o In ords.DefaultIfEmpty _
        Select New With {e.FirstName, e.LastName, .Order = o}

ObjectDumper.Write(q) End Sub
 

Consultez http://msdn.microsoft.com/en-us/vbasic/bb737929.aspx

5voto

mokth Points 32

J'ai trouvé 1 solution. si vous voulez traduire ce type de SQL (jointure à gauche) dans Linq Entity ...

SQL:

 SELECT * FROM [JOBBOOKING] AS [t0]
LEFT OUTER JOIN [REFTABLE] AS [t1] ON ([t0].[trxtype] = [t1].[code])
                                  AND ([t1]. [reftype] = "TRX")
 

LINQ:

 from job in JOBBOOKINGs
join r in (from r1 in REFTABLEs where r1.Reftype=="TRX" select r1) 
          on job.Trxtype equals r.Code into join1
from j in join1.DefaultIfEmpty()
select new
{
   //cols...
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X