Как внешнее объединение в F # с помощью FLinq? - PullRequest
9 голосов
/ 10 января 2011

вопрос в значительной степени говорит обо всем. У меня большой запрос flinq следующей формы:

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

используя эту форму, как я могу выполнить левое внешнее соединение между этими двумя таблицами?

Ответы [ 3 ]

5 голосов
/ 11 января 2011

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

0 голосов
/ 18 февраля 2011

В итоге я создал отдельные запросы для каждого внешнего соединения и вызывал его в определенные моменты при циклическом просмотре набора результатов самого внешнего запроса.

0 голосов
/ 18 февраля 2011

Возможно, вам следует создать представление в базе данных, которое выполнило левое внешнее соединение, а затем LINQ поверх этого представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...