2011-01-10 27 views
9

問題幾乎說明了一切。我有以下形式的大flinq查詢:如何在F#中使用FLinq進行外連接?

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

採用這種形式,我該怎麼辦左外這兩個表之間的連接?

回答

5

我認爲您可以使用Query模塊中的groupJoin功能。下面是使用羅斯文的產品作爲主表和類別與外鍵的表的例子:

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 

有一定表達這種使用seq { .. }語法的更好的方法,並通過實現加入類似的行爲使用嵌套for循環。不幸的是,對LINQ翻譯的引用可能不會支持這些。 (就個人而言,我寧願使用嵌套for編寫代碼,並使用if來檢查空集合)。

我只是在尋找在PowerPack的圖書館一些改進作爲F#團隊承包工作的一部分,因此這將在未來有望提高......(但是不敢保證!)

+0

但我該如何使用yield?我根本不想返回「(none)」 – Cynede 2011-02-18 07:26:30

0

也許你應該在執行左外連接的數據庫中創建視圖,然後在該視圖上創建LINQ。

0

我最終爲每個外連接創建了單獨的查詢,並在循環遍歷最外層查詢的結果集時在某些點調用它。