LINQ to SQL में आंतरिक जुड़ने के लिए वाक्यविन्यास क्या है?


443

मैं LINQ to SQL स्टेटमेंट लिख रहा हूं, और मैं मानक वाक्यविन्यास के बाद सामान्य आंतरिक जुड़ाव के लिए हूं ON C # में क्लॉज के ।

आप LINQ से SQL में निम्नलिखित का प्रतिनिधित्व कैसे करते हैं:

select DealerContact.*
from Dealer 
inner join DealerContact on Dealer.DealerID = DealerContact.DealerID

यदि आपके पास तालिकाओं के बीच एक विदेशी कुंजी है, तो आपको नीचे कर्क ब्रॉडहर्स्ट का जवाब देखना चाहिए।
गुइलहर्मे

1
आपको अपनी तालिका के नामों का बहुवचन करना चाहिए। एक टेबल होल्डिंग (कई कंपनियों के बारे में प्रविष्टियां) को डीलर कहा जाना चाहिए , न कि डीलर।
ANeves

5
@ सारणी बहुवचन तालिका नामों का उपयोग करने के लिए मानक अभ्यास से बहुत दूर है, दोनों एकवचन और बहुवचन पूरी तरह से स्वीकार्य हैं - मैं सिर्फ बहुवचन से अपने आप को वस्तु नामों से मेल करने के लिए एकवचन में बदल गया हूं - यहां शीर्ष उत्तर सहमत है एकवचन अधिक सुसंगत है (कई बहुवचन अजीब या गैर हैं अस्तित्व - उदाहरण के लिए '1 भेड़, 8 भेड़': stackoverflow.com/questions/338156/…
niico

@niico यह चर्चा करने का स्थान नहीं है, मुझे लगता है ... लेकिन Microsoft इकाई फ्रेमवर्क तालिका के नामों को बहुलता देता है , रूबी ऑन रेल्स ORM तालिकाओं को बहुल करता है ... क्या यह आपके लिए मानक-अभ्यास के काफी करीब है? :) काउंटर-तर्क: NHibernate तालिकाओं को बहुल नहीं करता है
एनिव्स

2
वास्तव में - कुछ लोग इसे एक तरह से करते हैं - कुछ इसे दूसरे तरीके से करते हैं। कोई मानक अभ्यास नहीं है। व्यक्तिगत रूप से मुझे लगता है कि एकवचन के पास अधिक लाभ हैं।
नीको

जवाबों:


572

यह कुछ इस तरह है:

from t1 in db.Table1
join t2 in db.Table2 on t1.field equals t2.field
select new { t1.field2, t2.field3}

बेहतर उदाहरण के लिए आपकी तालिकाओं के लिए समझदार नाम और क्षेत्र रखना अच्छा होगा। :)

अपडेट करें

मुझे लगता है कि आपकी क्वेरी के लिए यह अधिक उपयुक्त हो सकता है:

var dealercontacts = from contact in DealerContact
                     join dealer in Dealer on contact.DealerId equals dealer.ID
                     select contact;

चूंकि आप संपर्कों की तलाश कर रहे हैं, डीलरों की नहीं।


11
धन्यवाद, अब से मैं समझदार नामों का उपयोग सबसे अच्छे अभ्यास के रूप में from c or from t1
करूँगा

231

और क्योंकि मैं अभिव्यक्ति श्रृंखला सिंटैक्स पसंद करता हूँ, यहाँ है कि आप इसे कैसे करते हैं:

var dealerContracts = DealerContact.Join(Dealer, 
                                 contact => contact.DealerId,
                                 dealer => dealer.DealerId,
                                 (contact, dealer) => contact);

8
आप फिल्टर करने की जरूरत है या से खेतों पर चयन करते हैं दोनों में शामिल हो गए टेबल, बजाय सिर्फ दो तालिकाओं में से एक (इस उत्तर के उदाहरण में DealerContact तालिका) के क्षेत्रों पर की, यहाँ एक उदाहरण है: stackoverflow.com/a/29310640/12484
जॉन श्नाइडर

52

चतुर मानव द्वारा अभिव्यक्ति श्रृंखला वाक्यविन्यास उत्तर का विस्तार करने के लिए :

यदि आप दोनों तालिकाओं से फ़ील्ड पर चीज़ें (जैसे फ़िल्टर या सेलेक्ट) करना चाहते थे, तो एक साथ जुड़ने के बजाय - उन दो तालिकाओं में से एक पर - आप अंतिम पैरामीटर के लैम्बडा एक्सप्रेशन में एक नया ऑब्जेक्ट बना सकते हैं जॉइन मेथड उदाहरण के लिए, उन दोनों तालिकाओं को शामिल करना:

var dealerInfo = DealerContact.Join(Dealer, 
                              dc => dc.DealerId,
                              d => d.DealerId,
                              (dc, d) => new { DealerContact = dc, Dealer = d })
                          .Where(dc_d => dc_d.Dealer.FirstName == "Glenn" 
                              && dc_d.DealerContact.City == "Chicago")
                          .Select(dc_d => new {
                              dc_d.Dealer.DealerID,
                              dc_d.Dealer.FirstName,
                              dc_d.Dealer.LastName,
                              dc_d.DealerContact.City,
                              dc_d.DealerContact.State });

दिलचस्प हिस्सा उस उदाहरण की पंक्ति 4 में लंबोदर अभिव्यक्ति है:

(dc, d) => new { DealerContact = dc, Dealer = d }

... जहां हम एक नई अनाम-प्रकार की वस्तु का निर्माण करते हैं, जिसमें डीलरकॉन्टैक्ट और डीलर रिकॉर्ड के साथ-साथ उनके सभी क्षेत्रों के गुण होते हैं।

फिर हम उन रिकॉर्ड्स से फ़ील्ड्स का उपयोग कर सकते हैं जब हम फ़िल्टर करते हैं और परिणामों का चयन करते हैं, जैसा कि शेष उदाहरण द्वारा दर्शाया गया है, जो dc_dकि हमारे द्वारा बनाए गए अनाम ऑब्जेक्ट के लिए एक नाम के रूप में उपयोग करता है जिसमें डीलरकॉन्टैक्ट और डीलर रिकॉर्ड दोनों इसके गुण हैं।


9
लैम्ब्डा के साथ जोड़ों में भयानक सिंटैक्स होता है। मैं इसका इस्तेमाल करने से इनकार करता हूं ;-)
Mariusz

12
@aristo मैं आपको बिल्कुल दोष नहीं देता। मुझे आमतौर पर अपने आप को वाक्य रचना की याद दिलाने के लिए इस पोस्ट को वापस करना होगा!
जॉन श्नाइडर

2
मेरे जैसे कुछ लोग संगति पसंद करते हैं। इसलिए मैं विशेष रूप से लंबोदर सिंटैक्स की खोज करता हूं।
0014

43
var results = from c in db.Companies
              join cn in db.Countries on c.CountryID equals cn.ID
              join ct in db.Cities on c.CityID equals ct.ID
              join sect in db.Sectors on c.SectorID equals sect.ID
              where (c.CountryID == cn.ID) && (c.CityID == ct.ID) && (c.SectorID == company.SectorID) && (company.SectorID == sect.ID)
              select new { country = cn.Name, city = ct.Name, c.ID, c.Name, c.Address1, c.Address2, c.Address3, c.CountryID, c.CityID, c.Region, c.PostCode, c.Telephone, c.Website, c.SectorID, Status = (ContactStatus)c.StatusID, sector = sect.Name };


return results.ToList();

1
नमस्ते, क्या आप मुझे बता सकते हैं कि यह हिस्सा क्या है? स्थिति = (कॉन्टैक्टसैटस) सी। सैटसुडीड मैं अंश में तेजी से दिलचस्पी ले रहा हूं: (कॉन्टैक्टसैटस) सी। सेतुसिड सादर मारियस
मारियस

1
@aristo - कोड को देखते हुए, मैं अनुमान लगा रहा हूं कि ContactStatusवास्तव में एक एनम है, और c.StatusIDवास्तव में एक आईडी नहीं है, लेकिन एनम का संख्यात्मक मान है। अगर मैं सही हूं, (ContactStatus)c.StatusIDतो वास्तव में एक एनम को पूर्णांक डालना है।
जोएल म्यूलर

25

Linq Join ऑपरेटर का उपयोग करें :

var q =  from d in Dealer
         join dc in DealerConact on d.DealerID equals dc.DealerID
         select dc;

1
जब मुझे d और dc दोनों के कॉलम चाहिए तो क्या करें?
कुंतडी नितेश

1
@KuntadyNithesh फिर एक वर्ग चुनें जिसे आपने बनाया है जैसे नए MyCustomer {Id = dc.id, Id2 = d.id} Thats!
एलिजाबेथ

25

आप एक विदेशी कुंजी बनाते हैं, और LINQ-to-SQL आपके लिए नेविगेशन गुण बनाता है। प्रत्येक के Dealerपास फिर एक संग्रह होगा, DealerContactsजिसमें आप चयन, फ़िल्टर और हेरफेर कर सकते हैं।

from contact in dealer.DealerContacts select contact

या

context.Dealers.Select(d => d.DealerContacts)

यदि आप नेविगेशन गुणों का उपयोग नहीं कर रहे हैं, तो आप LINQ-to-SQL पर मुख्य लाभों में से एक को याद कर रहे हैं - वह हिस्सा जो ऑब्जेक्ट ग्राफ को मैप करता है।


अरे यार, तुमने मेरा समय बचाया, मुझे अब इन बेवकूफों से जुड़ने की जरूरत नहीं है!
टॉमस

23

मूल रूप से LINQ join ऑपरेटर SQL के लिए कोई लाभ प्रदान नहीं करता है। निम्न प्रश्न का उत्तर दें

var r = from dealer in db.Dealers
   from contact in db.DealerContact
   where dealer.DealerID == contact.DealerID
   select dealerContact;

SQL में INNER JOIN का परिणाम होगा

जुड़ना IEnumerable <> के लिए उपयोगी है क्योंकि यह अधिक कुशल है:

from contact in db.DealerContact  

खंड को हर डीलर के लिए फिर से निष्पादित किया जाएगा लेकिन IQueryable <> के लिए यह मामला नहीं है। साथ ही जुड़ना कम लचीला है।


12

दरअसल, अक्सर बेहतर है कि लाइन में शामिल न हों, जो कि है। जब आपके linq statement को लिखने के लिए नेविगेशन गुण बहुत ही सक्सेसफुल तरीका है:

from dealer in db.Dealers
from contact in dealer.DealerContacts
select new { whatever you need from dealer or contact }

यह एक खंड में अनुवाद करता है:

SELECT <columns>
FROM Dealer, DealerContact
WHERE Dealer.DealerID = DealerContact.DealerID

"क्‍लास" (जैसे इस उदाहरण में) से कई के साथ एक LINQ क्‍वेरी क्‍वेरी चेन सिंटैक्स में कैसा दिखता है? क्या यह संभव है?
जॉन श्नाइडर

1
इसकी विधि वाक्यविन्यास समतुल्य है SelectMany()
गर्ट अर्नोल्ड

3

इनर जॉइन करने के लिए LINQ जॉइन का उपयोग करें ।

var employeeInfo = from emp in db.Employees
                   join dept in db.Departments
                   on emp.Eid equals dept.Eid 
                   select new
                   {
                    emp.Ename,
                    dept.Dname,
                    emp.Elocation
                   };

3

इसे इस्तेमाल करे :

     var data =(from t1 in dataContext.Table1 join 
                 t2 in dataContext.Table2 on 
                 t1.field equals t2.field 
                 orderby t1.Id select t1).ToList(); 

3
var q=(from pd in dataContext.tblProducts join od in dataContext.tblOrders on pd.ProductID equals od.ProductID orderby od.OrderID select new { od.OrderID,
 pd.ProductID,
 pd.Name,
 pd.UnitPrice,
 od.Quantity,
 od.Price,
 }).ToList(); 

ढेर अतिप्रवाह में आपका स्वागत है! हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है। कृपया व्याख्यात्मक टिप्पणियों के साथ अपने कोड को भीड़ने की कोशिश न करें, क्योंकि इससे कोड और स्पष्टीकरण दोनों की पठनीयता कम हो जाती है!
गुडबाय StackExchange

2
OperationDataContext odDataContext = new OperationDataContext();    
        var studentInfo = from student in odDataContext.STUDENTs
                          join course in odDataContext.COURSEs
                          on student.course_id equals course.course_id
                          select new { student.student_name, student.student_city, course.course_name, course.course_desc };

जहां छात्र और पाठ्यक्रम तालिका में प्राथमिक कुंजी और विदेशी कुंजी संबंध है


2

इसके बजाय कोशिश करें,

var dealer = from d in Dealer
             join dc in DealerContact on d.DealerID equals dc.DealerID
             select d;

1
var Data= (from dealer in Dealer join dealercontact in DealerContact on dealer.ID equals dealercontact.DealerID
select new{
dealer.Id,
dealercontact.ContactName

}).ToList();


1
var list = (from u in db.Users join c in db.Customers on u.CustomerId equals c.CustomerId where u.Username == username
   select new {u.UserId, u.CustomerId, u.ClientId, u.RoleId, u.Username, u.Email, u.Password, u.Salt, u.Hint1, u.Hint2, u.Hint3, u.Locked, u.Active,c.ProfilePic}).First();

इच्छित तालिका नाम लिखें, और फ़ील्ड का परिणाम प्राप्त करने के लिए चयन को इनिशियलाइज़ करें।


var सूची = (u से db.Yourfirsttablename में cb में db.secondtablename पर u.firsttablecommonfields c.secondtablecommon फ़ील्ड के बराबर होता है, जहाँ u.Username = = उपयोगकर्ता नाम का चयन करते हैं नया {u.UserId, u.CustomerId, u.ClientId। uR। , u.Username, u.Email, u.Password, u.Salt, u.Hint1, u.Hint2, u.Hint3, u.Locked, u.Active, c.ProfilePic}) (पहले);
सरफराज सुतार

1

लाइनक सी # में दो तालिकाओं को मिलाएं

var result = from q1 in table1
             join q2 in table2
             on q1.Customer_Id equals q2.Customer_Id
             select new { q1.Name, q1.Mobile, q2.Purchase, q2.Dates }

1

डीलर 1 में d1 से d1.dealearid के बराबर में डीलर-कॉन्ट्रैक्टर में d2 मिलाएं d2.dealerid नए {dealercontract। * का चयन करें।


ढेर अतिप्रवाह में आपका स्वागत है! यह उत्तर पहले से मौजूद उत्तर में कुछ नहीं जोड़ता है।
जेरेन हेइर

-6

एक सबसे अच्छा उदाहरण

तालिका नाम: TBL_EmpऔरTBL_Dep

var result = from emp in TBL_Emp join dep in TBL_Dep on emp.id=dep.id
select new
{
 emp.Name;
 emp.Address
 dep.Department_Name
}


foreach(char item in result)
 { // to do}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.