Cú pháp cho một phép nối bên trong trong LINQ to SQL là gì?


443

Tôi đang viết một câu lệnh LINQ to SQL và tôi theo cú pháp chuẩn cho một phép nối bên trong bình thường với một ONmệnh đề trong C #.

Làm thế nào để bạn đại diện cho những điều sau đây trong LINQ to SQL:

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

Nếu bạn có khóa ngoại giữa các bảng, bạn nên xem câu trả lời của Kirk Broadhurst bên dưới.
Guilherme

1
Bạn nên số nhiều tên bảng của bạn. Một bảng giữ (mục về) nhiều đại lý nên được gọi là đại lý , và không phải đại lý.
ANeves

5
@ANeves Khác xa với cách sử dụng tên bảng số nhiều, cả số ít và số nhiều đều hoàn toàn chấp nhận được - Tôi chỉ chuyển từ số nhiều sang số ít để khớp với tên đối tượng - ở đây câu trả lời hàng đầu đồng ý số ít là phù hợp hơn (nhiều số nhiều là lạ hoặc không tồn tại - ví dụ '1 cừu, 8 cừu': stackoverflow.com/questions/338156/iêu
niico

@niico đây không phải là nơi để thảo luận về điều đó, tôi đoán vậy ... nhưng Microsoft Entity Framework đã đa dạng hóa các tên bảng , ORM của Ruby on Rails số nhiều các bảng ... có đủ gần với tiêu chuẩn thực hành cho bạn không? :) Đối số: NHibernate dường như không số nhiều bảng .
Ngày

2
Thật vậy - một số người làm theo cách này - một số người làm theo cách khác. Không có thực hành tiêu chuẩn. Cá nhân tôi nghĩ rằng số ít có nhiều lợi ích hơn.
niico

Câu trả lời:


572

Nó đi một cái gì đó như:

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

Sẽ thật tuyệt nếu có các tên và trường hợp lý cho các bảng của bạn để làm ví dụ tốt hơn. :)

Cập nhật

Tôi nghĩ cho truy vấn của bạn điều này có thể phù hợp hơn:

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

Vì bạn đang tìm kiếm địa chỉ liên lạc, không phải các đại lý.


11
cảm ơn bạn, từ giờ trở đi tôi sẽ sử dụng những cái tên hợp lý như một cách thực hành tốt nhất có ý nghĩa trong linq, thay vìfrom c or from t1
shaijut

231

Và bởi vì tôi thích cú pháp chuỗi biểu thức, đây là cách bạn làm điều đó với:

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

8
Nếu bạn cần lọc hoặc chọn trên các trường từ cả hai bảng đã tham gia, thay vì chỉ trên các trường của một trong hai bảng (bảng DealerContact trong ví dụ của câu trả lời này), đây là một ví dụ: stackoverflow.com/a/29310640/12484
Jon Schneider

52

Để mở rộng câu trả lời cú pháp chuỗi biểu thức của Clever Human:

Nếu bạn muốn thực hiện mọi thứ (như bộ lọc hoặc chọn) trên các trường từ cả hai bảng được nối với nhau - thay vì chỉ một trong hai bảng đó - bạn có thể tạo một đối tượng mới trong biểu thức lambda của tham số cuối cùng cho phương thức Tham gia kết hợp cả hai bảng đó, ví dụ:

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

Phần thú vị là biểu thức lambda trong dòng 4 của ví dụ đó:

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

... nơi chúng tôi xây dựng một đối tượng kiểu ẩn danh mới có các thuộc tính như các bản ghi DealerContact và Dealer, cùng với tất cả các trường của chúng.

Sau đó, chúng ta có thể sử dụng các trường từ các bản ghi đó khi chúng ta lọc và chọn kết quả, như được minh họa bằng phần còn lại của ví dụ, sử dụng dc_dlàm tên cho đối tượng ẩn danh mà chúng ta đã tạo có cả bản ghi DealerContact và Dealer làm thuộc tính của nó.


9
Tham gia với lambdas có cú pháp khủng khiếp. Tôi từ chối sử dụng nó ;-)
Mariusz

12
@aristo Tôi không trách bạn chút nào. Tôi thường phải tham khảo lại bài này để nhắc nhở bản thân về cú pháp!
Jon Schneider

2
Một số người như tôi thích sự nhất quán. Đó là lý do tại sao tôi tìm kiếm cú pháp lambda cụ thể.
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
Xin chào, bạn có thể cho tôi biết phần này là về cái gì không? Status = (ContactStatus) c.StatusID Tôi quan tâm đặc biệt đến đoạn: (ContactStatus) c.StatusID Trân trọng Mariusz
Mariusz

1
@aristo - Nhìn vào mã, tôi đoán đó ContactStatusthực sự là một enum và c.StatusIDkhông thực sự là một ID, mà là giá trị số của enum. Nếu tôi đúng, (ContactStatus)c.StatusIDthực sự chỉ là đúc một số nguyên cho một enum.
Joel Mueller

25

Sử dụng toán tử Linq Tham gia :

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

1
Phải làm gì khi tôi muốn cột của cả hai d & dc?
Kuntady Nithesh

1
@KuntadyNithesh Sau đó, trả lại một lớp bạn đã tạo như chọn MyCustomer mới {Id = dc.id, Id2 = d.id} Đó là nó!
Elisabeth

25

Bạn tạo khóa ngoại và LINQ-to-SQL tạo các thuộc tính điều hướng cho bạn. Mỗi cái Dealersau đó sẽ có một bộ sưu tập DealerContactsmà bạn có thể chọn, lọc và thao tác.

from contact in dealer.DealerContacts select contact

hoặc là

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

Nếu bạn không sử dụng các thuộc tính điều hướng, bạn đang bỏ lỡ một trong những lợi ích chính trên LINQ-to-SQL - phần ánh xạ biểu đồ đối tượng.


Ôi trời, bạn đã tiết kiệm thời gian của tôi, tôi không cần phải đối phó với những sự tham gia ngu ngốc này nữa!
Tomas

23

về cơ bản toán tử tham gia LINQ cung cấp không có lợi ích cho SQL. Tức là truy vấn sau

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

sẽ dẫn đến INNER THAM GIA trong SQL

tham gia rất hữu ích cho IEnumerable <> vì nó hiệu quả hơn:

from contact in db.DealerContact  

mệnh đề sẽ được thực thi lại cho mọi đại lý Nhưng đối với IQueryable <> thì không phải vậy. Ngoài ra tham gia là ít linh hoạt.


12

Trên thực tế, thường là tốt hơn không tham gia, trong linq đó là. Khi có các thuộc tính điều hướng, một cách rất ngắn gọn để viết câu lệnh linq của bạn là:

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

Nó dịch sang mệnh đề where:

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

Một truy vấn LINQ có nhiều mệnh đề "từ" (như trong ví dụ này) trông như thế nào trong cú pháp chuỗi biểu thức? Có thể không?
Jon Schneider

1
Cú pháp phương thức của nó tương đương là SelectMany().
Gert Arnold

3

Sử dụng tham gia LINQ để thực hiện Tham gia bên trong.

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

Thử cái này :

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

Chào mừng bạn đến với Stack Overflow! Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Xin vui lòng cố gắng không làm đông mã của bạn với các bình luận giải thích, vì điều này làm giảm khả năng đọc của cả mã và các giải thích!
Tạm biệt 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 };

Trường hợp bảng sinh viên và khóa học có mối quan hệ khóa chính và khóa ngoại


2

thay vào đó hãy thử

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 data=(from t in db.your tableName(t1) 
          join s in db.yourothertablename(t2) on t1.fieldname equals t2.feldname
          (where condtion)).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();

Viết tên bảng bạn muốn và khởi tạo lựa chọn để lấy kết quả của các trường.


danh sách var , u.Username, u.Email, u.Password, u.Salt, u.Hint1, u.Hint2, u.Hint3, u.Locked, u.Active, c.ProfilePic}). First ();
Sarfraj Sutar

1

Bên trong tham gia hai bảng trong 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 }

1

từ d1 trong DealerContrac tham gia d2 trong DealerContrac trên d1.dealearid bằng với d2.dealerid chọn {dealercontract mới. *}


Chào mừng bạn đến với Stack Overflow! Câu trả lời này không thêm gì vào câu trả lời đã có sẵn.
Jeroen Heier

-6

Một ví dụ tốt nhất

Tên bảng: TBL_EmpTBL_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}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.