2008-11-06 13 views
150

में मुझे कुछ परेशानी हो रही है कि LINQ से 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 

उत्तर

233

यह क्लीनर हो सकता है (आप न सब 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 

यहाँ,

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 
+1

जेनरेट किए गए एसक्यूएल कैसा दिखता है? क्या इसमें नेस्टेड इस तरह का चयन नहीं है? –

+11

@manitra: नहीं, आप वास्तव में बाएं बाहरी जॉइन स्टेटमेंट प्राप्त करते हैं (कोई नेस्टेड चयन नहीं)। बहुत पागल हुह? – Amir

+0

ग्रेट न्यूज क्योंकि, यह वाक्यविन्यास बिल्कुल स्पष्ट है :) –

2

मुझे लगता है कि आप this पोस्ट में इस्तेमाल किया विधि का पालन करने के लिए सक्षम होना चाहिए। यह वास्तव में बदसूरत लग रहा है, लेकिन मुझे लगता है कि आप इसे दो बार कर सकते हैं और परिणाम प्राप्त कर सकते हैं।

मुझे आश्चर्य है कि यह वास्तव में एक ऐसा मामला है जहां आप DataContext.ExecuteCommand(...) का उपयोग करके linq में परिवर्तित करने के बजाय बेहतर होगा।

45

VisualStudio (मैं अपने Mac पर हूँ) के लिए पहुँच नहीं है, लेकिन http://bhaidar.net/cs/archive/2007/08/01/left-outer-join-in-linq-to-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 } 
21

मैं कैसे पता लगा कई बाईं बाहरी उपयोग करने के लिए VB.NET में मिलती है एसक्यूएल करने के लिए LINQ का उपयोग कर:

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 
7

VB.NET में है। यदि यह आपकी आवश्यकता से मेल खाता है तो आप इसका उल्लेख कर सकते हैं। यहां मैं 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() 
0

मैं अपने आवेदन के लिए इस LINQ क्वेरी का उपयोग कर रहा एक और बाईं समारोह का उपयोग कर उदाहरण में शामिल होने

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 
    } 
संबंधित मुद्दे