Linq to Sql: несколько левых внешних соединений

У меня возникли проблемы с выяснением, как использовать более одного левого внешнего соединения с использованием LINQ to SQL. Я понимаю, как использовать одно левое внешнее соединение. Я использую VB. СЕТЬ. Ниже мой синтаксис SQL.

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
вопрос задан 6.11.2008
Bryan Roth
5691 репутация

6 ответов


  • 238 рейтинг

    Это может быть чище (, вам не нужны все into заявления ):

    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
    

    Вот еще один пример левого соединения

    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  
        }
    
    ответ дан Amir, с репутацией 7621, 28.12.2009
  • 47 рейтинг

    У меня нет доступа к VisualStudio (я на моем Mac), но я использую информацию из http: // bhaidar. сеть / CS / Архив / 2007/08/01 / левое внешнее_соединение-в-LINQ к SQL. aspx похоже, что вы можете сделать что-то вроде этого:

    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 }
    
    ответ дан tvanfosson, с репутацией 416703, 6.11.2008
  • 22 рейтинг

    Я понял, как использовать несколько левых внешних объединений в VB. NET с использованием LINQ to SQL:

    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
    
    ответ дан Bryan Roth, с репутацией 5691, 6.11.2008
  • 8 рейтинг

    В В.Б. NET с помощью функции,

    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 
    
    ответ дан Mitul, с репутацией 5674, 17.09.2012
  • 3 рейтинг

    Я думаю, что вы должны быть в состоянии следовать методу, использованному в этой статье . Это выглядит ужасно, но я думаю, вы могли бы сделать это дважды и получить желаемый результат.

    Интересно, действительно ли это тот случай, когда вам лучше использовать DataContext.ExecuteCommand(...) вместо преобразования в linq.

    ответ дан Jon Norton, с репутацией 2477, 6.11.2008
  • 0 рейтинг

    Я использую этот запрос linq для моего приложения. если это соответствует вашим требованиям, вы можете отослать это. здесь я присоединился (левое внешнее соединение) с 3 таблицами.

     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()
    
    ответ дан Iam ck, с репутацией 1, 8.11.2017