2012-10-04 82 views
6

Tôi đang chuyển đổi một truy vấn SQL thành LINQ tạo ra một phép nối trái với ánh xạ 1-đến-1, và nó phải ở trong Cú pháp Phương thức. Tôi đã được kéo ra khỏi mái tóc của tôi cố gắng để thực hiện điều này để không có tấm màn che. Tôi có thể làm điều đó trong Lambda Cú pháp. Dưới đây là truy vấn mẫu tôi đang cố chạy. Chúng không phải là mã thực. Có ai đó sẽ chỉ ra những gì tôi đang làm sai?JOIN và LEFT JOIN tương đương trong LINQ với phương pháp Cú pháp

SQL:

SELECT item.*, item_status.* 
FROM item 
LEFT JOIN item_status 
    ON item.ID = item_status.itemID 
    AND item_status.FLAGGED = true 
WHERE item.published_date > "2008-06-19" 

LINQ:

var linq_query = (
    from selected_item in item 
    join selected_item_status in item_status 
     on selected_item.ID equals item_status.itemID into joined 
    from item_status in joined.DefaultIfEmpty() 
    where item_status.FLAGGED = true 
    select new {selected_item, selected_item_status}).ToList(); 
+0

Làm cách nào để chúng tôi cho bạn biết mã của bạn có gì sai nếu mã không thực sự mã? Chúng ta cũng có thể thấy lớp 'Item',' item_status', và lớp mà bạn đưa danh sách kiểu ẩn danh vào, xin vui lòng? –

Trả lời

8

Các join ... into trở thành một GroupJoin và thứ hai from trở thành một SelectMany:

var linq_query = Item 
    .GroupJoin(
     item_status.Where(x => x.selected_item_status.FLAGGED), // EDIT: Where clause moved here. 
     selected_item => selected_item.ID, 
     selected_item_status => selected_item_status.itemID, 
     (selected_item, joined) => new 
     { 
      selected_item, 
      statuses = joined.DefaultWithEmpty(), 
     }) 
    .SelectMany(x => x.statuses.Select(selected_item_status => new 
    { 
     x.selected_item, 
     selected_item_status, 
    })) 
    // EDIT: Removed where clause. 
    .ToList(); 

Dường như Where làm trái tham gia bên ngoài không cần thiết, như n Trạng thái ull sẽ được lọc ra.

EDIT: Không, khi xem xét SQL có vẻ như truy vấn LINQ của bạn hơi không chính xác. Nó phải là:

var linq_query = (
    from selected_item in item 
    join selected_item_status 
     in (
      from status in item_status 
      where status.FLAGGED 
      select status) 
     on selected_item.ID equals item_status.itemID into joined 
    from item_status in joined.DefaultIfEmpty() 
    select new {selected_item, selected_item_status}).ToList(); 
+0

Cảm ơn! Nó không bao giờ xảy ra với tôi để có mệnh đề where trên bảng đã gia nhập ở đó. – s1300045

+0

Cảm ơn vì điều này - Tôi vừa đưa ra câu trả lời này và đó là những gì mà Iw đang tìm kiếm. Khi tôi nghĩ về nó, đặt mệnh đề where ở chỗ đó giống với SQl hơn là phương thức không phải là phương thức linq. – EGP