问题几乎说明了一切。我有以下形式的大flinq查询:
for alias1 in table1 do
for alias2 in table2 do
if alias1.Id = alias2.foreignId
使用此表单,如何在这两个表之间进行左外连接?
答案 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)
我最终为每个外部联接创建了单独的查询,并在循环遍历最外层查询的结果集时在某些点调用它。