2011-02-10 32 views
5

Xin chào, tôi có thể biết cách chọn điều kiện "trường hợp" trong việc sử dụng LINQ không? Mã nhận xét là câu hỏi của tôi. làm thế nào để tôi đặt điều kiện ở đó? mã của tôi:linq tham gia với điều kiện trường hợp

var r = from u in Users 
    join p in Payments on u.Id equals p.UserId 
    join soi in SaleOrderItems on p.ReferenceId equals soi.Id 
      //if soi.InventoryTypeId == 1 
       //then join i in Inventories on soi.InventoryOrCourseId equals i.Id 
      //elseif soi.InventorytypeId ==2 
       //then join c in Courses on soi.InventoryOrCourseId equals c.Id 
    where u.Id == 5 
    select new{ u, p, soi, either i or c}; 

Trả lời

2

Bạn cần phải sử dụng một số bên ngoài tham gia trick để thực hiện điều này, một phương pháp đơn giản là thông qua DefaultIfEmpty(). Về cơ bản bạn tạo một bên tham gia sau đó mở rộng nó với hàng mất tích:

var r = from u in Users 
    join p in Payments on u.Id equals p.UserId 
    join soi in SaleOrderItems on p.ReferenceId equals soi.Id 
    join i in Inventories on new {a = soi.InventoryTypeId, b = soi.InventoryOrCourseId } equals new {a = 1, b = i.Id} into g1 
    from oi in g1.DefaultIfEmpty() 
    join c in Courses on new {a = soi.InventoryTypeId, b = soi.InventoryOrCourseId } equals new {a = 2, b = c.Id} into g2 
    from oc in g2.DefaultIfEmpty() 
    where u.Id == 5 
    select new{ u, p, soi, ic = oi ?? oc}; 

Hãy cẩn thận về tuyên bố mới nhất này ic = oi ?? oc, kể từ khi các loại khác nhau các loại vô danh sẽ sử dụng khai System.Object để nó có thể chứa cả hai loại, nếu bạn muốn sử dụng hỗ trợ đánh máy mạnh mẽ có thể là một lựa chọn tốt hơn sẽ là trả lại cả oc và ic và sau đó kiểm tra. Bạn nên quyết định tốt nhất dựa trên cách bạn sử dụng truy vấn này muộn ron.

+0

@mmix hi tôi nhận được lỗi này "Loại của một trong các biểu thức trong mệnh đề nối không chính xác. Gõ suy luận không thành công trong lệnh gọi 'GroupJoin'." tại dòng tham gia i trong Hàng tồn kho trên {a ... – VeecoTech

+0

Loại nào mới là 'soi.InventoryTypeId'? Vì tôi tưởng tượng 'type (soi.InventoryOrCourseId)' bằng 'type (Inventory.Id)' thì nó phải là 'soi.InventoryTypeId' không phải là' int'. Nếu vậy, trang trí hằng số 1 và 2 với hậu tố loại thích hợp (U, L, v.v.) – mmix

+0

@mmix: có cả hai đều chính xác là int – VeecoTech

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