Я думаю, вы можете использовать функцию groupJoin
, доступную в модуле Query
.Вот пример использования Northwind с продуктами в качестве основной таблицы и категорий в качестве таблицы с внешним ключом:
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 #, так что, надеюсь, это улучшится в будущем ... (но без обещаний!)