Работа со связанными таблицами с использованием последовательностей F # linq2sql - PullRequest
1 голос
/ 17 февраля 2011

Научи меня, как мне улучшить мои F # linq2sql seqences

здесь я использую linq2sql, но думаю, что у меня с этим проблемы.

и основная проблема - доступ по ID здесь, в примере я делаю 2 встроенных для, но я получил очень страшные запросы linq2 sql, потому что я не знаю, есть ли какие-то дополнительные методы или способы сделать это ...

member X.deltaArchive() = // Reacting on delta limits
    seq { for a in db.ArchiveAnalogs do
            for d in db.Deltas do
                if a.ID = d.ID then
                    if a.Value > d.DeltaLimit then
                        yield d.AboveMessage
                    else if a.Value < d.DeltaLimit then
                        yield d.BelowMessage
        } |> Array.ofSeq

Таким образом, полный вопрос: есть ли способ сделать то же самое, не используя встроенные циклы, чтобы найти соответствие id?

Спасибо.

Добавлено:

с использованием:

    <@ seq {for a in db.ArchiveAnalogs do
                for d in db.Deltas do
                    if a.ID = d.ID then
                        if a.Value > d.DeltaLimit then
                            yield a.Date, d.AboveMessage
                        else if a.Value < d.DeltaLimit then
                            yield a.Date, d.BelowMessage}
         @> |> query |> Array.ofSeq

получил ошибку:

    The following construct was used in query but is not recognised by the F#-to-LINQ query translator:
Call (None,
      System.Collections.Generic.IEnumerable`1[System.Tuple`2[System.DateTime,System.String]] Singleton[Tuple`2](System.Tuple`2[System.DateTime,System.String]),
      [NewTuple (PropertyGet (Some (a), System.DateTime Date, []),
                 PropertyGet (Some (d), System.String AboveMessage, []))])
This is not a valid query expression. Check the specification of permitted queries and consider moving some of the query out of the quotation

offtopic: я должен найти решение, потому что это первая ссылка Google о "F # linq2sql"

1 Ответ

2 голосов
/ 17 февраля 2011

Прежде всего, написанный вами фрагмент не использует LINQ to SQL.Вы выполняете всю обработку в памяти, потому что F # не выбирает операторы запроса на основе типа (как это делает C #).Вам нужно явно пометить запрос, чтобы запустить его на SQL:

#r "FSharp.PowerPack.Linq.dll"
open Microsoft.FSharp.Linq

<@ seq { for a in db.ArchiveAnalogs do ... } @> |> query

Альтернативный способ написать то, что вы хотите, - это использовать функцию Query.join (из PowerPack).Я считаю, что следующее должно сработать:

<@ join db.ArchiveAnalogs db.Deltas (fun a -> a.ID) (fun d -> d.ID) (fun a d ->
     if a.Value > d.DeltaLimit then
         yield d.AboveMessage
     else if a.Value < d.DeltaLimit then
         yield d.BelowMessage ) @> |> query

(Хотя, я думаю, что на самом деле нет никакой разницы между использованием join и вложенным for - если вы запустите это на SQL, то это скорее всегооптимизировать его, чтобы присоединиться в любом случае).

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