问题几乎说明了一切。我有以下形式的大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