Apa sintaks untuk bergabung dalam dalam LINQ ke SQL?

443

Saya menulis pernyataan LINQ ke SQL, dan saya mencari sintaks standar untuk gabungan normal dengan ONklausa dalam C #.

Bagaimana Anda mewakili yang berikut ini dalam LINQ ke SQL:

select DealerContact.*
from Dealer 
inner join DealerContact on Dealer.DealerID = DealerContact.DealerID
Glenn Slaven
sumber
Jika Anda memiliki kunci asing di antara tabel, Anda harus melihat jawaban Kirk Broadhurst di bawah ini.
Guilherme
1
Anda harus mempluralkan nama tabel Anda. Sebuah meja memegang (entri tentang) banyak dealer harus disebut dealer , dan bukan dealer.
ANeves
5
@ ANeves Jauh dari praktik standar untuk menggunakan nama tabel jamak, baik tunggal maupun jamak sangat dapat diterima - Saya baru saja beralih dari jamak ke tunggal untuk mencocokkan nama objek - di sini jawaban teratas setuju bahwa singular lebih konsisten (banyak pluralisasi aneh atau tidak ada - misalnya '1 domba, 8 domba': stackoverflow.com/questions/338156/…
niico
@niico ini bukan tempat untuk membahas itu, saya kira ... tetapi Microsoft Entity Framework menjamur nama-nama tabel , ORM di Ruby on Rails menjernihkan tabel ... apakah itu cukup dekat dengan praktik standar untuk Anda? :) Kontra-argumen: NHibernate tampaknya tidak menjernihkan tabel .
ANeves
2
Memang - beberapa orang melakukannya dengan satu cara - beberapa melakukannya dengan cara lain. Tidak ada praktik standar. Secara pribadi saya pikir singular memiliki banyak manfaat.
niico

Jawaban:

572

Bunyinya seperti:

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

Akan menyenangkan untuk memiliki nama dan bidang yang masuk akal untuk tabel Anda untuk contoh yang lebih baik. :)

Memperbarui

Saya pikir untuk permintaan Anda ini mungkin lebih tepat:

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

Karena Anda mencari kontak, bukan dealer.

Jon Limjap
sumber
11
terima kasih, mulai sekarang saya akan menggunakan nama yang masuk akal sebagai praktik terbaik yang masuk akal di LINQ, bukannyafrom c or from t1
shaijut
231

Dan karena saya lebih suka sintaksis rantai ekspresi, berikut adalah bagaimana Anda melakukannya dengan itu:

var dealerContracts = DealerContact.Join(Dealer, 
                                 contact => contact.DealerId,
                                 dealer => dealer.DealerId,
                                 (contact, dealer) => contact);
CleverPatrick
sumber
8
Jika Anda perlu memfilter atau memilih bidang dari kedua tabel yang bergabung, alih-alih hanya pada bidang dari salah satu dari dua tabel (tabel DealerContact dalam contoh jawaban ini), berikut ini contohnya: stackoverflow.com/a/29310640/12484
Jon Schneider
52

Untuk memperluas jawaban sintaksis rantai ekspresi oleh Clever Human:

Jika Anda ingin melakukan hal-hal (seperti memfilter atau memilih) pada bidang dari kedua tabel yang disatukan - alih-alih hanya pada salah satu dari dua tabel tersebut - Anda bisa membuat objek baru dalam ekspresi lambda dari parameter terakhir ke metode Bergabung dengan metode menggabungkan kedua tabel tersebut, misalnya:

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

Bagian yang menarik adalah ekspresi lambda di baris 4 dari contoh itu:

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

... tempat kami membuat objek tipe anonim baru yang memiliki properti yang dicatat DealerContact dan Dealer, beserta semua bidangnya.

Kami kemudian dapat menggunakan bidang dari catatan tersebut saat kami memfilter dan memilih hasil, seperti yang ditunjukkan oleh sisa contoh, yang menggunakan dc_dsebagai nama untuk objek anonim yang kami buat yang memiliki catatan DealerContact dan Dealer sebagai propertinya.

Jon Schneider
sumber
9
Bergabung dengan lambdas memiliki sintaks yang buruk. Saya menolak untuk menggunakannya ;-)
Mariusz
12
@aristo saya tidak menyalahkan Anda sama sekali. Saya biasanya harus merujuk kembali ke posting ini untuk mengingatkan diri saya pada sintaks!
Jon Schneider
2
Beberapa orang seperti saya lebih suka konsistensi. Itu sebabnya saya mencari sintaks lambda secara khusus.
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();
herste
sumber
1
Hai, dapatkah Anda memberi tahu saya bagian apa ini? Status = (ContactStatus) c.StatusID Saya tertarik secara khusus dalam fragmen: (ContactStatus) c.StatusID Salam Mariusz
Mariusz
1
@aristo - melihat kode, saya menduga itu ContactStatusbenar-benar enum, dan c.StatusIDbukan benar-benar ID, tetapi nilai numerik dari enum. Jika saya benar, (ContactStatus)c.StatusIDbenar-benar hanya melemparkan integer ke enum.
Joel Mueller
25

Gunakan operator Linq Join :

var q =  from d in Dealer
         join dc in DealerConact on d.DealerID equals dc.DealerID
         select dc;
aku
sumber
1
apa yang harus dilakukan ketika saya ingin kolom kedua d & dc?
Kuntady Nithesh
1
@KuntadyNithesh Kemudian kembalikan kelas yang telah Anda buat seperti pilih MyCustomer baru {Id = dc.id, Id2 = d.id} Thats it!
Elisabeth
25

Anda membuat kunci asing, dan LINQ-to-SQL membuat properti navigasi untuk Anda. Masing Dealer- masing kemudian akan memiliki koleksi DealerContactsyang dapat Anda pilih, filter, dan manipulasi.

from contact in dealer.DealerContacts select contact

atau

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

Jika Anda tidak menggunakan properti navigasi, Anda kehilangan salah satu manfaat utama pada LINQ-to-SQL - bagian yang memetakan grafik objek.

Kirk Broadhurst
sumber
Oh man, kamu menghemat waktu saya, saya tidak perlu berurusan dengan bergabung bodoh ini lagi!
Tomas
23

pada dasarnya LINQ bergabung dengan operator tidak memberikan manfaat untuk SQL. Yaitu permintaan berikut

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

akan menghasilkan INNER GABUNG dalam SQL

bergabung berguna untuk IEnumerable <> karena lebih efisien:

from contact in db.DealerContact  

klausa akan dieksekusi kembali untuk setiap dealer Tapi untuk IQueryable <> bukan itu masalahnya. Juga bergabung kurang fleksibel.

the_joric
sumber
12

Sebenarnya, seringkali lebih baik tidak bergabung, dalam LINQ itu. Ketika ada properti navigasi cara yang sangat ringkas untuk menulis pernyataan LINQ Anda adalah:

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

Ini diterjemahkan menjadi klausa di mana:

SELECT <columns>
FROM Dealer, DealerContact
WHERE Dealer.DealerID = DealerContact.DealerID
Gert Arnold
sumber
Seperti apa query LINQ dengan beberapa klausa "dari" (seperti dalam contoh ini) dalam sintaksis rantai ekspresi? Apa itu mungkin?
Jon Schneider
1
Metode ini setara dengan sintaks SelectMany().
Gert Arnold
3

Gunakan LINQ bergabung untuk melakukan Inner Join.

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
                   };
Uthaiah
sumber
3

Coba ini :

     var data =(from t1 in dataContext.Table1 join 
                 t2 in dataContext.Table2 on 
                 t1.field equals t2.field 
                 orderby t1.Id select t1).ToList(); 
Ajay
sumber
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(); 
ammad khan
sumber
Selamat Datang di Stack Overflow! Sementara potongan kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda. Tolong juga cobalah untuk tidak membuat kerumunan kode Anda dengan komentar penjelasan, karena ini mengurangi keterbacaan kode dan penjelasan!
Selamat tinggal 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 };

Di mana tabel siswa dan kursus memiliki kunci utama dan hubungan kunci asing

Sandeep Shekhawat
sumber
2

coba ini,

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

}).ToList();
Ankita_systematix
sumber
1
var data=(from t in db.your tableName(t1) 
          join s in db.yourothertablename(t2) on t1.fieldname equals t2.feldname
          (where condtion)).tolist();
sanket parikh
sumber
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();

Tulis nama tabel yang Anda inginkan, dan inisialisasi pilih untuk mendapatkan hasil bidang.

Sarfraj Sutar
sumber
var list = (dari Anda di db.Yourfirsttablename bergabung dengan c di db.secondtablename di u.firsttablecommonfields sama dengan bidang c.secondtablecommon di mana u.Pengguna == nama pengguna pilih new {u.UserId, u.CustomerId, u.CustomerId, u.ClientId, u.ClientId , u.Pengguna, u.Email, u.Password, u.Salt, u.Hint1, u.Hint2, u.Hint3, u.Locked, u.Active, c.ProfilePic}). First ();
Sarfraj Sutar
1

Inner gabung dua tabel di linq C #

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 }
Md Shahriar
sumber
1

dari d1 di DealerContrac, gabung d2 di DealerContrac pada d1.dealearid sama dengan d2.dealerid pilih new {dealercontract. *}

Rutu
sumber
Selamat Datang di Stack Overflow! Jawaban ini tidak menambahkan apa pun ke jawaban yang sudah ada.
Jeroen Heier
-6

Satu contoh terbaik

Nama Tabel: TBL_EmpdanTBL_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}
Prasad KM
sumber