লিনকু থেকে এসকিউএল অভ্যন্তরীণ যোগদানের জন্য সিনট্যাক্স কী?


443

আমি এসকিউএল বিবৃতিতে একটি লিনকিউ লিখছি, এবং আমি ONসি # এর একটি ধারা দিয়ে একটি সাধারণ অভ্যন্তরীণ জোড়ার মানক সিনট্যাক্স পরে এসেছি ।

আপনি কীভাবে নিম্নলিখিত এসকিউএল-তে লিনকিউতে প্রতিনিধিত্ব করেন:

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

টেবিলগুলির মধ্যে যদি আপনার কাছে কোনও বিদেশী কী থাকে তবে আপনার নীচের দিকে কર્ક ব্রডহার্স্টের উত্তরটি দেখতে হবে।
গিলহর্ম

1
আপনার টেবিলের নামগুলি বহুবচন করা উচিত। একটি টেবিল হোল্ডিং (প্রায় এন্ট্রি) অনেক ব্যবসায়ী নামক উচিত ব্যবসায়ী , এবং ব্যাপারী।
এভিনিস

5
@ আনেভস বহুবিধ টেবিলের নাম ব্যবহার করা মানসম্মত চর্চা থেকে অনেক দূরে, একক এবং বহুবচন উভয়ই পুরোপুরি গ্রহণযোগ্য - আমি কেবলমাত্র বহুবচ থেকে একা একা একা নিজেকে পরিবর্তিত করেছি বস্তুর নামগুলির সাথে মেলে - এখানে শীর্ষগুলির উত্তর সম্মত হয় যে একবচনটি আরও সামঞ্জস্যপূর্ণ (অনেকগুলি বহুবচন অদ্ভুত বা অবিচ্ছিন্ন অস্তিত্ব - যেমন '1 ভেড়া, 8 মেষ': stackoverflow.com/questions/338156/...
niico

@নিমিকো এটি নিয়ে আলোচনার জায়গা নয়, আমার ধারণা ... তবে মাইক্রোসফ্ট সত্তা ফ্রেমওয়ার্কটি টেবিলের নামগুলি বহুবচনে করে , রবি অন রেলস এর ওআরএম টেবিলগুলি বহুবচন করে তোলে ... এটি কি আপনার জন্য মান-অনুশীলনের পক্ষে যথেষ্ট? :) পাল্টা যুক্তি: এনএইচবারনেট টেবিলগুলি বহুগুণিত করে না বলে মনে হচ্ছে
এনিভেস

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
যদি আপনার দুটি টেবিলের একটির (এই উত্তরের উদাহরণে ডিলারকন্ট্যাক্ট টেবিল) কেবলমাত্র ক্ষেত্রের পরিবর্তে উভয় যুক্ত টেবিলের ক্ষেত্রগুলিতে ফিল্টার বা নির্বাচন করতে হয় তবে এখানে একটি উদাহরণ দেওয়া হয়েছে: stackoverflow.com/a/29310640/12484
জন স্নাইডার

52

চতুর মানব দ্বারা এক্সপ্রেশন চেইন সিনট্যাক্স উত্তর প্রসারিত করতে :

যদি আপনি উভয় টেবিলের ক্ষেত্রগুলিতে একসাথে যোগদানের ক্ষেত্রগুলিতে (ফিল্টার বা নির্বাচন করার মতো) কাজ করতে চান - পরিবর্তে one দুটি টেবিলের মধ্যে একটিতে - আপনি যোগদানের পদ্ধতিতে চূড়ান্ত প্যারামিটারের ল্যাম্বডা এক্সপ্রেশনটিতে একটি নতুন অবজেক্ট তৈরি করতে পারেন এই দুটি সারণী একত্রিত করা, উদাহরণস্বরূপ:

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
ল্যাম্বডাসের সাথে যোগ দেয় ভয়াবহ সিনট্যাক্স। আমি এটি ব্যবহার করতে প্রত্যাখ্যান করি ;-)
মারিউজ

12
@ আরিস্টো আমি আপনাকে মোটেও দোষ দিচ্ছি না। নিজেকে সিনট্যাক্সের কথা মনে করিয়ে দেওয়ার জন্য আমাকে সাধারণত এই পোস্টে ফিরে যেতে হয়!
জন স্নাইডার

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
হাই, আপনি কি এই অংশটি সম্পর্কে দয়া করে বলতে পারেন? স্থিতি = (ContactStatus) c.StatusID আমি টুকরা মধ্যে এবং expecially আগ্রহী: (ContactStatus) c.StatusID শুভেচ্ছা সহ Mariusz
Mariusz

1
@ অ্যারিস্টো - কোডটির দিকে তাকিয়ে আমি অনুমান করছি যে ContactStatusএটি সত্যিই একটি এনাম, এবং c.StatusIDসত্যই কোনও আইডি নয়, তবে এনামের সংখ্যাগত মান। যদি আমি সঠিক, (ContactStatus)c.StatusIDসত্যিই একটি এনাম একটি পূর্ণসংখ্যা কাস্টিং হয়।
জোয়েল মুলার

25

লিনক যোগ অপারেটর ব্যবহার করুন :

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

1
আমি যখন ডি ও ডিসি উভয়ের কলাম চাই তখন কী করব?
কুন্তাদি নীতেশ

1
@ কুন্তাদ্যনিথেশ তারপরে আপনি নির্বাচিত নতুন মাইক্রাস্টমারের মতো আইডি = ডিসি.আইডি, আইডি 2 = ডি.আইডি like এটির মতো ক্লাসটি ফিরিয়ে দিন!
এলিজাবেথ

25

আপনি একটি বিদেশী কী তৈরি করেন এবং LINQ-to-SQL আপনার জন্য নেভিগেশন বৈশিষ্ট্য তৈরি করে। Dealerএরপরে প্রত্যেকের কাছে একটি সংগ্রহ থাকবে DealerContactsযার মধ্যে আপনি নির্বাচন করতে, ফিল্টার করতে এবং পরিচালনা করতে পারবেন ulate

from contact in dealer.DealerContacts select contact

অথবা

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

আপনি যদি নেভিগেশন বৈশিষ্ট্যগুলি ব্যবহার করছেন না, আপনি লিনকিউ-টু-এসকিউএল-এর মূল সুবিধাগুলির একটি হারিয়ে ফেলছেন - যে অংশটি অবজেক্টের গ্রাফকে মানচিত্র করে।


ওহে মানুষ, তুমি আমার সময় বাঁচিয়েছ, এই বোকা লোকদের সাথে আমার আর যোগ দেওয়ার দরকার নেই!
টমাস

23

মূলত লিনকিউ জয়েন অপারেটর এসকিউএল এর জন্য কোনও লাভ দেয় না অর্থাত নিচের কোয়েরি

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

এসকিউএল-এ অন্তর্ভুক্ত হবে ফলাফল

আইইনুমারেবল <> এর জন্য যোগদান দরকারী কারণ এটি আরও দক্ষ:

from contact in db.DealerContact  

প্রতিটি ডিলারের জন্য ক্লজটি আবার কার্যকর করা হবে তবে আইকোয়ারিযোগ্য <> ক্ষেত্রে এটি হয় না। এছাড়াও যোগদান কম নমনীয়।


12

আসলে, প্রায়শই এটি লিঙ্কে যোগদান না করাই ভাল। যখন নেভিগেশন বৈশিষ্ট্যগুলি থাকে তখন আপনার লিনাক স্টেটমেন্টটি লেখার খুব সাবলীল উপায় হয়:

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

এক্সপ্রেশন চেইন সিনট্যাক্সে একাধিক "থেকে" ধারাগুলি (এই উদাহরণ হিসাবে) এর সাথে একটি লিনকিউ কোয়েরি দেখতে কেমন? এটা কি সম্ভব?
জন স্নাইডার

1
এর পদ্ধতির সিনট্যাক্স সমতুল্য SelectMany()
গার্ট আর্নল্ড

3

অভ্যন্তরীণ যোগদানের জন্য LINQ যোগদান করে Use

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(); 

স্ট্যাক ওভারফ্লোতে স্বাগতম! যদিও এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে, সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না। আপনার কোডটি ব্যাখ্যামূলক মন্তব্যে ভিড় না করার চেষ্টা করুন, কারণ এটি কোড এবং ব্যাখ্যা উভয়ের পাঠযোগ্যতা হ্রাস করে!
বিদায় স্ট্যাক এক্সচেঞ্জ 14

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 তালিকা = (আপনার থেকে ডিবিতে। আপনার প্রথম স্টেটেবল কমফোনফিল্ডে db.secondtablename এর সাথে সি যোগ দিন c.secondtablecommon ক্ষেত্রের যেখানে u.Username == ব্যবহারকারীর নামটি নতুন {u.UserId, u.CustomerId, u.ClientId, u.RoleId নির্বাচন করুন , u.Username, u.Email, u.Password, u.Salt, u.Hint1, u.Hint2, u.Hint3, u.Lock, u.Acttive, 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 থেকে ডিলার কনট্রাকের ডি 2 এ যোগদান করুন


স্ট্যাক ওভারফ্লোতে স্বাগতম! এই উত্তরটি ইতিমধ্যে বিদ্যমান উত্তরের সাথে কিছুই যোগ করে না।
জেরোইন হাইয়ার

-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}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.