2011-01-10 31 views
9

câu hỏi khá nhiều nói tất cả. Tôi có một truy vấn flinq lớn theo mẫu sau:cách tham gia bên ngoài trong F # bằng FLinq?

for alias1 in table1 do 
    for alias2 in table2 do 
     if alias1.Id = alias2.foreignId 

bằng cách sử dụng biểu mẫu này, làm cách nào để tôi có thể tham gia bên ngoài bên ngoài giữa hai bảng này?

Trả lời

5

Tôi nghĩ bạn có thể sử dụng chức năng groupJoin có sẵn trong mô-đun Query. Dưới đây là một ví dụ sử dụng Northwind với các sản phẩm như bảng tiểu học và mục như bảng với chính nước ngoài:

open System.Linq 

<@ Query.groupJoin 
    db.Products db.Categories 
    (fun p -> p.CategoryID.Value) 
    (fun c -> c.CategoryID) 
    (fun p cats -> 
     // Here we get a sequence of all categories (which may be empty) 
     let cat = cats.FirstOrDefault() 
     // 'cat' will be either a Category or 'null' value 
     p.ProductName, if cat = null then "(none)" else cat.CategoryName) @> 
|> query 

Có chắc chắn là cách đẹp hơn thể hiện này bằng cách sử dụng cú pháp seq { .. } và bằng cách thực hiện hành vi tham gia giống như sử dụng lồng nhau for vòng lặp. Unfortunatelly, các trích dẫn cho dịch giả LINQ có lẽ sẽ không hỗ trợ những điều này. (Cá nhân, tôi muốn viết mã bằng cách sử dụng lồng nhau for và sử dụng if để kiểm tra bộ sưu tập trống).

Tôi chỉ nhìn vào một số cải tiến trong thư viện PowerPack là một phần trong công việc ký kết hợp đồng cho # đội F, vì vậy đây hy vọng sẽ cải thiện trong tương lai ... (nhưng không hứa hẹn!)

+0

nhưng làm cách nào tôi có thể sử dụng lợi nhuận ở đây? Tôi không muốn trả về "(none)" ở tất cả – Cynede

+0

Tôi không nghĩ rằng hàm 'groupJoin' hỗ trợ điều này, nhưng bạn luôn có thể thêm' |> Seq.filter' để thả tất cả các mục có giá trị 'null' . –

0

Có lẽ bạn nên tạo một khung nhìn trong cơ sở dữ liệu đã thực hiện phép nối ngoài bên trái và sau đó LINQ trên khung nhìn đó.

0

Tôi đã tạo các truy vấn riêng biệt cho mỗi phép nối ngoài và gọi tại một số điểm nhất định khi lặp qua resultset của truy vấn ngoài cùng.

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