webentwicklung-frage-antwort-db.com.de

Linq to Sql: Mehrere äußere äußere Verbindungen

Ich habe Probleme, herauszufinden, wie mehr als ein linker Outer-Join mit LINQ to SQL verwendet wird. Ich verstehe, wie man einen linken äußeren Join verwendet. Ich verwende VB.NET. Unten ist meine SQL-Syntax.

T-SQL

SELECT
    o.OrderNumber,
    v.VendorName,
    s.StatusName
FROM
    Orders o
LEFT OUTER JOIN Vendors v ON
    v.Id = o.VendorId
LEFT OUTER JOIN Status s ON
    s.Id = o.StatusId
WHERE
    o.OrderNumber >= 100000 AND
    o.OrderNumber <= 200000
155
Bryan Roth

Dies kann sauberer sein ( Sie brauchen nicht alle into-Anweisungen ):

var query = 
    from order in dc.Orders
    from vendor 
    in dc.Vendors
        .Where(v => v.Id == order.VendorId)
        .DefaultIfEmpty()
    from status 
    in dc.Status
        .Where(s => s.Id == order.StatusId)
        .DefaultIfEmpty()
    select new { Order = order, Vendor = vendor, Status = status } 
    //Vendor and Status properties will be null if the left join is null

Hier ist ein weiteres Link-Join-Beispiel

var results = 
    from expense in expenseDataContext.ExpenseDtos
    where expense.Id == expenseId //some expense id that was passed in
    from category 
    // left join on categories table if exists
    in expenseDataContext.CategoryDtos
                         .Where(c => c.Id == expense.CategoryId)
                         .DefaultIfEmpty() 
    // left join on expense type table if exists
    from expenseType 
    in expenseDataContext.ExpenseTypeDtos
                         .Where(e => e.Id == expense.ExpenseTypeId)
                         .DefaultIfEmpty()
    // left join on currency table if exists
    from currency 
    in expenseDataContext.CurrencyDtos
                         .Where(c => c.CurrencyID == expense.FKCurrencyID)
                         .DefaultIfEmpty() 
    select new 
    { 
        Expense = expense,
        // category will be null if join doesn't exist
        Category = category,
        // expensetype will be null if join doesn't exist
        ExpenseType = expenseType,
        // currency will be null if join doesn't exist
        Currency = currency  
    }
242
Amir

Ich habe keinen Zugriff auf VisualStudio (ich bin auf meinem Mac), sondern die Informationen aus http://bhaidar.net/cs/archive/2007/08/01/left-outer-join-in-linq -to-sql.aspx Es sieht so aus, als könnten Sie so etwas tun:

var query = from o in dc.Orders
            join v in dc.Vendors on o.VendorId equals v.Id into ov
            from x in ov.DefaultIfEmpty()
            join s in dc.Status on o.StatusId equals s.Id into os
            from y in os.DefaultIfEmpty()
            select new { o.OrderNumber, x.VendorName, y.StatusName }
48
tvanfosson

Ich habe herausgefunden, wie man mehrere linke äußere Joins in VB.NET mit LINQ to SQL verwendet:

Dim db As New ContractDataContext()

Dim query = From o In db.Orders _
            Group Join v In db.Vendors _
            On v.VendorNumber Equals o.VendorNumber _
            Into ov = Group _
            From x In ov.DefaultIfEmpty() _
            Group Join s In db.Status _
            On s.Id Equals o.StatusId Into os = Group _
            From y In os.DefaultIfEmpty() _
            Where o.OrderNumber >= 100000 And o.OrderNumber <= 200000 _
            Select Vendor_Name = x.Name, _
                   Order_Number = o.OrderNumber, _
                   Status_Name = y.StatusName
22
Bryan Roth

In VB.NET mit der Funktion

Dim query = From order In dc.Orders
            From vendor In 
            dc.Vendors.Where(Function(v) v.Id = order.VendorId).DefaultIfEmpty()
            From status In 
            dc.Status.Where(Function(s) s.Id = order.StatusId).DefaultIfEmpty()
            Select Order = order, Vendor = vendor, Status = status 
8
Mitul

Ich denke, Sie sollten in der Lage sein, die in this post verwendete Methode zu befolgen. Es sieht wirklich hässlich aus, aber ich würde denken, Sie könnten es zweimal machen und das gewünschte Ergebnis erzielen.

Ich frage mich, ob dies tatsächlich ein Fall ist, in dem Sie DataContext.ExecuteCommand(...) besser verwenden sollten, anstatt in linq zu konvertieren.

3
Jon Norton

Ich verwende diese linq-Abfrage für meine Anwendung. Wenn dies Ihren Anforderungen entspricht, können Sie dies verweisen. Hier habe ich mich mit 3 Tischen zusammengeschlossen (Left Outer Join). 

 Dim result = (From csL In contractEntity.CSLogin.Where(Function(cs) cs.Login = login AndAlso cs.Password = password).DefaultIfEmpty
                   From usrT In contractEntity.UserType.Where(Function(uTyp) uTyp.UserTypeID = csL.UserTyp).DefaultIfEmpty ' <== makes join left join
                   From kunD In contractEntity.EmployeeMaster.Where(Function(kunDat) kunDat.CSLoginID = csL.CSLoginID).DefaultIfEmpty
                   Select New With {
                  .CSLoginID = csL.CSLoginID,
                  .UserType = csL.UserTyp}).ToList()
0
Iam ck