2011-01-19 12 views
14

Mỗi ví dụ đơn lẻ của các phép nối trong LINQ đối với thực thể chỉ liên quan đến một cột trong mệnh đề on. Cú pháp là gì nếu tôi cần 2 hoặc nhiều cột để thực hiện công việc join? Tôi sẽ cần một ví dụ cho LINQ to Entities Query Expressions và Method Based cũng, nếu có thể. Dưới đây là ví dụ về những gì tôi cần. Không có mối quan hệ giữa Bảng 1 và Bảng 2.Nối các bảng sử dụng nhiều cột trong LINQ thành đối tượng

CREATE TABLE dbo.Table1 (
    ID1Table1 INT NOT NULL, 
    ID2Table1 SMALLDATETIME NOT NULL, 
    Value1Table1 VARCHAR(50) NOT NULL, 
    CONSTRAINT PK_Table1 PRIMARY KEY (ID1Table1, ID2Table1)); 
CREATE TABLE dbo.Table2 (
    ID1Table2 INT NOT NULL, 
    ID2Table2 SMALLDATETIME NOT NULL, 
    ID3Table2 INT NOT NULL, 
    Value1Table2 VARCHAR(50) NOT NULL, 
    CONSTRAINT PK_Table2 PRIMARY KEY (ID1Table2, ID2Table2, ID3Table2)); 

SELECT a.ID1Table1, a.ID2Table1, a.Value1Table1, b.ID3Table2, b.Value1Table2 
FROM dbo.Table1 a JOIN dbo.Table2 b 
    ON a.ID1Table1 = b.ID1Table2 
    AND a.ID2Table1 = b.ID2Table2 

Trả lời

20

Bạn có thể viết nó sử dụng hai từ ngữ như dưới đây:

from a in Table1s 
from b in Table2s 
where a.ID1Table1 == b.ID1Table2 && a.ID2Table1 == b.ID2Table2 
select new {a.ID1Table1, a.ID2Table1, a.Value1Table1, b.ID3Table2, b.Value1Table2} 

Sử dụng tham gia:

from a in Table1s 
join b in Table2s on new{a.ID1Table1, a.ID2Table1} equals new{b.ID1Table2,b.ID2Table2} 
select new {a.ID1Table1, a.ID2Table1, a.Value1Table1, b.ID3Table2, b.Value1Table2} 
+0

Ok, tks. Tôi sẽ giải quyết vấn đề của tôi, nhưng tôi thực sự muốn biết làm thế nào để thực hiện điều này là sử dụng tham gia, trong Query Expression và Method-Based. – Pascal

+0

Đã cập nhật bài đăng. Xin lỗi. – Chandu

+0

Người đàn ông, làm việc như một say mê! Tks sooooooooo ... không thể tìm thấy ở đâu cả ... Khái niệm tương tự áp dụng cho Lambda, phải không? – Pascal

11

Đối với phương pháp truy vấn dựa trên:

var query = ctx.Table1s.Join(ctx.Table2s, 
    a => new { a.ID1Table1, a.ID2Table1 }, 
    b => new { b.ID1Table2, b.ID2Table2 }, 
    (t1, t2) => new { 
    t1.ID1Table1, t1.ID2Table1, t1.Value1Table1, t2.ID3Table2, t2.Value1Table2 
}); 

nếu xảy ra là tên cột chính là khác nhau betwe vi hai bảng, sau đó nên gán cùng một tên thích hợp trong bộ chọn bên ngoài và bên trong. ví dụ:

var query = ctx.Table1s.Join(ctx.Table2s, 
    a => new { key1 = a.ID1Table1, key2 = a.ID2Table1 }, 
    b => new { key1 = b.ID1Table2, key2 = b.ID2Table2 }, 
    (t1, t2) => new { 
    t1.ID1Table1, t1.ID2Table1, t1.Value1Table1, t2.ID3Table2, t2.Value1Table2 
}); 

để xác minh các truy vấn trên, in báo cáo sql:

string sql = ((System.Data.Objects.ObjectQuery)query).ToTraceString(); 
Các vấn đề liên quan