如何使用FLinq外连接F#?

时间:2011-01-10 19:57:43

标签: linq linq-to-sql f#

问题几乎说明了一切。我有以下形式的大flinq查询:

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

使用此表单,如何在这两个表之间进行左外连接?

3 个答案:

答案 0 :(得分:5)

我认为您可以使用groupJoin模块中提供的Query功能。下面是一个使用Northwind,将Products作为主表,将Categories作为具有外键的表的示例:

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#团队合同工作的一部分,所以这有望在未来得到改善......(但没有承诺!)

答案 1 :(得分:0)

也许您应该在数据库中创建一个执行左外连接的视图,然后在该视图上创建LINQ。

答案 2 :(得分:0)

我最终为每个外部联接创建了单独的查询,并在循环遍历最外层查询的结果集时在某些点调用它。