問題幾乎說明了一切。我有以下形式的大flinq查詢:如何在F#中使用FLinq進行外連接?
for alias1 in table1 do
for alias2 in table2 do
if alias1.Id = alias2.foreignId
採用這種形式,我該怎麼辦左外這兩個表之間的連接?
問題幾乎說明了一切。我有以下形式的大flinq查詢:如何在F#中使用FLinq進行外連接?
for alias1 in table1 do
for alias2 in table2 do
if alias1.Id = alias2.foreignId
採用這種形式,我該怎麼辦左外這兩個表之間的連接?
我認爲您可以使用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#團隊承包工作的一部分,因此這將在未來有望提高......(但是不敢保證!)
也許你應該在執行左外連接的數據庫中創建視圖,然後在該視圖上創建LINQ。
我最終爲每個外連接創建了單獨的查詢,並在循環遍歷最外層查詢的結果集時在某些點調用它。
但我該如何使用yield?我根本不想返回「(none)」 – Cynede 2011-02-18 07:26:30