LINQ to SQL Left Outer Join

Cette requête est-elle équivalente à une LEFT OUTER ?

 //assuming that I have a parameter named 'invoiceId' of type int from c in SupportCases let invoice = c.Invoices.FirstOrDefault(i=> i.Id == invoiceId) where (invoiceId == 0 || invoice != null) select new { Id = c.Id , InvoiceId = invoice == null ? 0 : invoice.Id } 

Pas tout à fait – puisque chaque rangée “gauche” dans une jointure gauche-externe correspondra à des lignes “droites” 0-n (dans la seconde table), où vos correspondances ne correspondent qu’à 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 )

Vous n’avez pas besoin de dans les déclarations:

 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 bien une jointure LEFT OUTER.

Lien vers une question similaire qui gère plusieurs jointures à gauche: Linq à Sql: plusieurs jointures externes à gauche

 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 

Vérifiez http://msdn.microsoft.com/en-us/vbasic/bb737929.aspx

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... } 

J’aimerais append une chose. Dans LINQ to SQL, si votre firebase database est correctement construite et que vos tables sont liées par des contraintes de clé étrangère, vous n’avez pas besoin de créer de jointure.

En utilisant LINQPad, j’ai créé la requête LINQ suivante:

 //Querying from both the CustomerInfo table and OrderInfo table from cust in CustomerInfo where cust.CustomerID == 123456 select new {cust, cust.OrderInfo} 

Qui a été traduit à la requête (légèrement tronquée) ci-dessous

  -- Region Parameters DECLARE @p0 Int = 123456 -- EndRegion SELECT [t0].[CustomerID], [t0].[AlternateCustomerID], [t1].[OrderID], [t1].[OnlineOrderID], ( SELECT COUNT(*) FROM [OrderInfo] AS [t2] WHERE [t2].[CustomerID] = [t0].[CustomerID] ) AS [value] FROM [CustomerInfo] AS [t0] LEFT OUTER JOIN [OrderInfo] AS [t1] ON [t1].[CustomerID] = [t0].[CustomerID] WHERE [t0].[CustomerID] = @p0 ORDER BY [t0].[CustomerID], [t1].[OrderID] 

Notez la LEFT OUTER JOIN ci-dessus.