2011-01-10 68 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

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