wake-up-neo.com

LINQ to SQL Linke äußere Verknüpfung

Entspricht diese Abfrage einem LEFT OUTER Beitreten?

//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
}
133
Ali Kazmi

Nicht ganz - da jede "linke" Zeile in einem Left-Outer-Join mit 0-n "rechten" Zeilen (in der zweiten Tabelle) übereinstimmt, wobei Ihre nur mit 0-1 übereinstimmt. Für einen Left Outer Join benötigen Sie SelectMany und DefaultIfEmpty, zum Beispiel:

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

( oder über die Erweiterungsmethoden )

157
Marc Gravell

Sie brauchen die into-Anweisungen nicht:

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

Und ja, die obige Abfrage erstellt tatsächlich einen LEFT OUTER-Join.

Verknüpfen Sie mit einer ähnlichen Frage, die mehrere linke Joins behandelt: Linq to Sql: Mehrere linke äußere Joins

202
Amir
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

Überprüfen Sie http://msdn.Microsoft.com/en-us/vbasic/bb737929.aspx

13

Ich habe 1 Lösung gefunden. Wenn Sie diese Art von SQL (linker Join) in Linq Entity übersetzen möchten ...

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

Ich möchte noch eine Sache hinzufügen. Wenn Ihre Datenbank in LINQ to SQL ordnungsgemäß erstellt wurde und Ihre Tabellen durch Fremdschlüsseleinschränkungen verknüpft sind, müssen Sie überhaupt keinen Join ausführen.

Mit LINQPad habe ich folgende LINQ-Abfrage erstellt:

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

Welches wurde in die (leicht abgeschnittene) Abfrage unten übersetzt

 -- 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]

Beachten Sie die LEFT OUTER JOIN über.

2
Brian Kraemer