2011-10-14 34 views
13

Có nhiều bài đăng về LINQ và nhiều lần tham gia. Tôi tuy nhiên không tìm thấy bất kỳ giải pháp nào cho việc tham gia mà tôi muốn thực hiện.LINQ to Entity: Nhiều điều kiện tham gia

SQL tương đương sẽ là một cái gì đó như thế này:

SELECT * FROM table1 a 
LEFT JOIN table2 b ON a.col1 = b.key1 AND 
a.col2 = b.key2 AND 
b.from_date <= now() AND 
b.deleted = 0; 

Dưới đây là một trong vô số các truy vấn LINQ Tôi đã cố gắng

var query = (from x in context.table1 
      join y in context.table2 on new {x.col1, x.col2} equals {b.key1, b.key2} 
      into result 
      from result...... 

Làm thế nào tôi có thể thêm các điều kiện additonal của ngày và xóa cờ? Nếu tôi sử dụng .Điều kiện ở đây, thì điều này được coi là kết nối bên trong, không phải là kết nối bên trái.

Trả lời

32

Một cách khác có thể giống như

var query = (from x in context.table1 
      join y in context.table2 on 
      new { 
        Key1 = x.col1, 
        Key2 = x.col2 
        Key3 = true, 
        Key4 = true 
       } 
      equals 
      new { 
        Key1 = y.key1, 
        Key2 = y.key2, 
        Key3 = y.from_date< DateTime.Now, 
        Key4 = !y.deleted 
       } 
      into result 
from r in result.DefaultIfEmpty() 
select new {x.Something, r.Something} 
1

Bạn không chỉ lọc tập hợp kết quả thứ nhất bằng truy vấn thứ hai?

var query = (from x in context.table1 
      join y in context.table2 on new {x.col1, x.col2} equals {b.key1, b.key2} 
      into result 
query = from x in query 
     where ... 

Điều đó có hiệu quả không?

11

LINQ hỗ trợ cả hai tham gia cú pháp và cũ ANSI-82 Ở ĐÂU cú pháp. Sử dụng sau này, bạn có thể thực hiện những gì bạn đang tìm kiếm từ

var nowTime = DateTime.Now; 
var query = from a in context.table1 
      from b in context.table2 
      where a.col1 == b.key1 
       && a.col2 == b.key2 
       && b.from_date < nowTime 
       && b.deleted == false 
      select ???; 

Ngoài ra, bạn có thể sử dụng kết hợp địa điểm và tham gia. (Nhận ra rằng thứ tự các câu truy vấn LINQ không cần phải bắt chước những gì bạn sẽ làm trong SQL và trật tự là linh hoạt hơn.)

var nowTime = DateTime.Now; 
var query = from b in context.table2 
      where b.from_date < nowTime 
       && b.deleted == false 
      join a on new {b.key1, b.key2} equals new {a.col1, a.col2} 
      select ???; 
0

tôi có vấn đề với cách đặt tên của các thuộc tính trong đối tượng ẩn danh:

var subscriptions = context.EmailSubscription.Join(context.EmailQueue, 
        es => new { es.Id, 9 }, 
        eq => new { eq.EmailSubscriptionId, eq.EmailTemplateId }, 
        (es, eq) => new { es.Id, eq.Id } 
       ).ToList(); 

Trình biên dịch không vui vì vậy câu trả lời trên giúp tôi tìm ra điều gì đã xảy ra và đây là giải pháp làm việc của tôi. Tôi mất một thời gian để tìm ra lỗi lầm ngu ngốc :):

var subscriptions = context.EmailSubscription.Join(context.EmailQueue, 
        es => new { EmailSubscriptionId = es.Id, EmailTemplateId = 9 }, 
        eq => new { eq.EmailSubscriptionId, eq.EmailTemplateId }, 
        (es, eq) => new { es.Id, eq.Id } 
       ).ToList(); 
Các vấn đề liên quan