2009-03-31 14 views
121

क्या यह प्रश्न LEFT OUTER से जुड़ा हुआ है?LINQ से SQL 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 
} 

उत्तर

141

नहीं काफी - के बाद से में एक "बाएं" पंक्ति एक बाएँ बाहरी-में शामिल होने के 0-एन "सही" पंक्तियों के अनुरूप होगा (दूसरी तालिका में), जहां के रूप में तुम्हारा ही 0-1 से मेल खाता है। एक छोड़ दिया बाहरी में शामिल होने के लिए, आप SelectMany और DefaultIfEmpty की जरूरत है, उदाहरण के लिए:

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

(or via the extension methods)

+4

LINQ से इकाइयों को विधि पहचान नहीं है डिफ़ॉल्ट IFEmpty ... –

+13

क्या कोई यह समझ सकता है कि यह पागल वाक्यविन्यास कैसे काम करता है? मैं यह देखने में असफल रहा कि उन खोजशब्दों में से कोई भी जादूगर रूप से इसे बाएं शामिल करता है। "एसआर में" क्या करता है? लिंक मुझे कभी-कभी निराश करता है :) –

+1

@ जो फिलिप्स मेरे पास बहुत सारे SQL अनुभव हैं लेकिन LINQ सीखने की कोशिश करना मिट्टी के माध्यम से wading है। मैं मानता हूं कि यह बिल्कुल पागल है। –

12
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 

चेक http://msdn.microsoft.com/en-us/vbasic/bb737929.aspx

+0

अच्छा प्रयास करें लेकिन ऐसा लगता है कि ओपी सी # का उपयोग कर रहा है। वीबी वाक्यविन्यास विचित्र रूप से अलग है। – Levitikon

+3

+1 बस क्योंकि यह एक अच्छा vb.net उदाहरण – twoleggedhorse

4

मैं 1 समाधान मिल गया। अगर एसक्यूएल (बाएं में शामिल होने) Linq इकाई में इस तरह का अनुवाद करने के लिए ... चाहते

एसक्यूएल:

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

देखें [यह टिप्पणी] (http://stackoverflow.com/questions/700523/linq-to-sql-left-outer-join#comment21835463_700580), लिंक-टू -एसक्यूएल इकाइयां 'DefaultIfEmpty' का समर्थन नहीं करती हैं। –

177

आप बयान में की जरूरत नहीं है:

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 

और हाँ, क्वेरी से ऊपर वास्तव में एक वाम बाहरी में शामिल होने का सृजन करता है । इसी तरह की एक प्रश्न के

लिंक कि कई बाईं संभालती मिलती है: Linq to Sql: Multiple left outer joins

+10

जबकि मुझे पता है कि @Marc Gravvel का जवाब काम करता है, मैं वास्तव में इस विधि को पसंद करता हूं क्योंकि आईएमओ यह महसूस करता है कि बाएं जुड़ने की तरह क्या दिखना चाहिए। – llaughlin

+1

उत्कृष्ट जवाब। Google खोज के 5 घंटे से अधिक की तलाश में है। यह एकमात्र तरीका है जिसके परिणामस्वरूप एसक्यूएल इसमें शामिल हो जाएगा। –

+1

धन्यवाद बहुत बहुत .... मैं इस दोपहर के लिए एक समाधान की खोज कर रहा था और आपके कोड ने इसे खींचा (और बूट करने के लिए प्राकृतिक लगता है)। इच्छा है कि मैं इसे कई बार उठा सकता हूं। – Jim

1

मैं एक और बात जोड़ना चाहते हैं। LINQ से SQL में यदि आपका डीबी ठीक तरह से बनाया गया है और आपकी तालिकाएं विदेशी कुंजी बाधाओं से संबंधित हैं, तो आपको बिल्कुल शामिल होने की आवश्यकता नहीं है।

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

कौन सा LEFT OUTER JOIN ऊपर नीचे

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

सूचना (थोड़ा छोटा कर दिया) क्वेरी के लिए अनुवाद किया गया था:

LINQPad का उपयोग मैं निम्नलिखित LINQ क्वेरी बनाया।