Ich freue mich auf einige häufige Abfragen über mehrere Tabellen. In einem sehr einfachen Beispiel alle Tabellen haben eine DataDate
Spalte, so habe ich Anfragen wie folgt aus:Parametrize F # Abfragen basierend auf Eigenschaften
let dtexp1 = query { for x in table1 do maxBy x.Datadate }
let dtexp2 = query { for x in table2 do maxBy x.Datadate }
Basierend auf einem previous question ich folgendes tun:
let mkQuery t q =
query { for rows in t do maxBy ((%q) rows) }
let getMaxDt1 = mkQuery table1 (<@ fun q -> q.Datadate @>)
let getMaxDt2 = mkQuery table2 (<@ fun q -> q.Datadate @>)
würde mich interessieren, ob es andere Lösungen, die keine Angebote verwenden. Der Grund dafür ist, dass für kompliziertere Anfragen die Zitate und das Spleißen schwierig zu lesen sind.
Das wird zum Beispiel nicht funktionieren, offensichtlich, da wir nicht wissen, dass x Eigenschaft DataDate hat.
let getMaxDt t = query { for x in t do maxBy x.Datadate }
Wenn ich nicht abstrahieren kann über die Art der Tabelle 1, Tabelle 2, usw., die durch SqlProvider erzeugt werden.
thx. Das ist ein interessanter Ansatz. Wird darüber nachdenken. Ja, die Abfragen sind etwas dynamisch und ich kann mit Zitaten umgehen. Aber war neugierig, ob es etwas gibt, das es idiomatisch/einfacher macht, mit Generika oder Schnittstellen, oder (keuchen) SRTP als letzten Ausweg. – s952163
Wenn Sie die "string concat" Straße gehen: Stellen Sie sicher, dass Sie Ihre Anwendung nicht in die SQL Injection-Gefahrenzone bringen. – CaringDev
@CaringDev Guter Punkt. Wenn 'SqlCommand' verwendet wird, um die resultierende Abfrage auszuführen, besteht die beste Option darin, Parameter über' SqlParameter' hinzuzufügen (siehe https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/configuring-parameters- Und-Parameter-Datentypen).Auf diese Weise werden Benutzereingaben niemals mit der Abfragezeichenfolge verknüpft und Sie sollten in Ordnung sein! –