2010-08-23 35 views
15

Tôi đang đấu tranh với mệnh đề tham gia/ở đâu với câu lệnh chọn sql chọn đơn giản.LINQ Tham gia ở đâu Khoản

Tôi đang cố gắng truy xuất danh sách thông tin sản phẩm từ tb1 với điều kiện ở đằng sau nằm trong tbl2 nhưng điều này phải được nối với nhau bằng ba cột khác nhau.

nên SQL sẽ giống dọc theo dòng:

SELECT  tb1.* 
FROM   tb2 INNER JOIN 
         tb1 ON tb2.Col1 = tb1. Col1 AND tb2.Col2 = tb1. Col2 AND 
         tb2.Col3 = tb1.Col3 
WHERE  (tb2.Col1 = col1) AND (tb2.Col2 = col2) AND (tb2.Col4 = string) 

ColX là chính mệnh đề where với chuỗi được thông qua tại như tham số; tất cả các cột khác nằm trong ngữ cảnh.

Làm cách nào để bạn triển khai nhiều kết nối với mệnh đề where?

Và xẻng đúng hướng, được đánh giá cao.

Trả lời

42

Để tham gia trên nhiều lĩnh vực trong LINQ, bạn phải tạo ra một loại vô danh mới có chứa các cột bạn muốn so sánh và sau đó sử dụng loại vô danh trong tham gia:

var results = from t1 in context.tb1 
       join t2 in context.tb2 
       on new { t1.Col1, t1.Col2, t1.Col3 } equals 
        new { t2.Col1, t2.Col2, t2.Col3 } 
       where t2.Col1 == col1 && t2.Col2 == col2 && t2.Col4 == someString 
       select t1; 

Và đây là Lambda tương đương Cú pháp:

var results = context.tb1.Join(
        context.tb2, 
        t1 => new { t1.Col1, t1.Col2, t1.Col3 }, 
        t2 => new { t2.Col1, t2.Col2, t2.Col3 }, 
        (t1, t2) => new { t1, t2 }) 
       .Where(o => o.t2.Col1 == col1 
        && o.t2.Col2 == col2 
        && o.t2.Col4 == someString) 
       .Select(o => o.t1); 

Như bạn có thể thấy, trong trường hợp tham gia, cú pháp truy vấn thường tạo ra câu lệnh dễ đọc hơn.

+0

Truyền thuyết - cảm ơn Justin. Tôi nghĩ nếu tôi tiếp tục cạo râu khoảng 3 giờ nữa, thử và sai sẽ đưa tôi đến đây !! Cảm ơn rất nhiều. –

+0

Có thể thực hiện điều này trong cấu trúc phương thức (giao diện thông thạo) không? –

+1

@Maxim Zaslavsky - Bạn có nghĩa là sử dụng Cú pháp Lambda? –

7

Bạn cũng có thể bao gồm mệnh đề WHERE trong cú pháp lamda trong tham chiếu đến bảng bạn đang tham gia.

 var query = from pt in dc.ProjectTasks 
        join ttab in dc.TimeTaskAssigns on pt.Id equals ttab.ProjectTaskId 
        join ttb2 in dc.CMS_TAT_TIMEs.Where(a => a.WIP_STATUS == 'B') on ttab.CmsTimeUno equals ttb2.TIME_UNO 
        select pt; 

Có vẻ hiển nhiên, phải không? Tôi đã mất rất nhiều thời gian để tìm ra giải pháp đó.

Các vấn đề liên quan