Entity Framework zum Abfragen von JSON-Zeichenfolgen in SQL Server

9

Ich suche nach jemandem, der etwas in der Art getan hat, JSON-Strings mit dem Entity Framework abzufragen.

Ich sollte ein wenig Hintergrundinformationen darüber geben, was ich hier zu tun versuche. Die Datenbank, die ich verwende, ist für eine Workflow-Engine, an der ich gerade arbeite. Es verarbeitet alle Workflow-Daten und ermöglicht Ihnen außerdem, einige benutzerdefinierte Daten als JSON-Zeichenfolge zu speichern. Die von mir verwendete Workflow-Engine behandelt das Serialisieren und Deserialisieren der JSON-Zeichenfolgen pro Anfrage, aber für den Fall, dass ich eine Abfrage ausführen und auf Werten in der JSON-Zeichenfolge filtern möchte, müsste ich ziehen die gesamte Tabelle in den Speicher und Deinserialisierung aller Einträge und dann filtern. Dies ist aus offensichtlichen Gründen nicht akzeptabel. Der Grund dafür ist, dass wir eine einzige Workflow-Datenbank haben möchten, die für alle Anwendungen verwendet werden kann, die diese Workflow-Engine verwenden, und wir versuchen zu vermeiden, dass Datenbanksichten anwendungsspezifische Datenbanken trennen müssen, um die benutzerdefinierten Daten zu erhalten. Da in den meisten Fällen die benutzerdefinierten Anforderungsdaten, die als JSON-Zeichenfolgen gespeichert werden, relativ einfach sind, werden sie in den meisten Fällen nicht benötigt, wenn sie abgefragt werden. Aber für den Fall, dass wir benutzerdefinierte Suchvorgänge durchführen müssen, benötigen wir eine Möglichkeit, diese benutzerdefinierten JSON-Objekte analysieren zu können. Und ich hoffe, dass dies dynamisch mit Entity getan werden kann, so dass ich keine extra gespeicherten Procs für die Abfrage bestimmter Objekttypen schreiben muss. Idealerweise hätte ich nur eine Bibliothek, die Entitäten verwendet, um Abfragen von JSON-Datenstrukturen zu ermöglichen.

Ich habe mit einer Datenbankfunktion begonnen, die JSON analysiert und eine geglättete Tabelle zurückgibt, die die Werte (Elternobjekt-ID, Name, Wert und Typ) enthält. Dann importierte ich diese Funktion in mein Entitätsmodell. Hier ist ein Link zu wo ich den Code bekommen habe. Ziemlich interessanter Artikel.

JSON-Zeichenfolgen in SQL Server verwenden

Hier sind die Grundlagen wo ich bin.

%Vor%

Im obigen Codebeispiel ist Request-Objekt mein Basis-Workflow-Request-Objekt. RequestData () ist eine Erweiterungsmethode für den Typ

%Vor%

und parseJSON ist der Name meiner Datenbankfunktion.

Mein Plan ist, eine Reihe von Erweiterungsmethoden zu schreiben, die die Queryables filtern

%Vor%

Also zum Beispiel, wenn ich ein Objekt habe, das so aussieht.

%Vor%

Ich könnte etwas wie

machen %Vor%

oder etwas in dieser Richtung. Die .Where-Methode würde RequestData () nehmen, das ist ein IQueryable, das den analysierten JSON enthält, würde es filtern und das neue IQueryable-Ergebnis zurückgeben.

Also meine Frage ist wirklich, hat jemand so etwas getan? Wenn ja, welche Art von Ansatz haben Sie gewählt? Meine ursprüngliche Absicht war, etwas Wörterbuchstil zu machen, aber es schien zu schwierig. Alle Gedanken, Ideen, Vorschläge, Weisheit, würden sehr geschätzt werden. Ich habe eine Weile daran gearbeitet, und ich habe das Gefühl, dass ich wirklich nicht so weit gekommen bin. Das liegt hauptsächlich daran, dass ich nicht entscheiden kann, wie ich die Syntax aussehen soll, und ich bin mir nicht sicher, ob ich mehr Arbeit auf der Datenbankseite machen sollte.

Das war meine ursprüngliche Idee für die Syntax, aber ich konnte den Operator [] nicht ausführen, ohne das Objekt zu hydratisieren.

%Vor%

Ich weiß, das ist ein ziemlich langer Post, also wenn du so weit gelesen hast, danke, dass du dir nur die Zeit genommen hast, die ganze Sache zu lesen.

    
Callan 03.07.2013, 04:18
quelle

3 Antworten

1

Ab SQL Server 2016 gibt es FOR JSON und OPENJSON, die FOR XML und OPENXML entsprechen. Sie können auf Ausdrücke indexieren, die auf JSON verweisen, das in NVARCHAR-Spalten gespeichert ist.

    
Emyr 25.01.2017 15:28
quelle
0

Sie können eine CLR SQL Server-benutzerdefinierte Funktion erstellen und sie dann in Ihrer Abfrage verwenden.

Siehe diesen Link Ссылка

Ich würde denken, dass eine Tabellenwert-Funktionen für Ihre Situation besser geeignet ist.

    
Tien Dinh 10.05.2015 07:18
quelle
0

Dies ist eine sehr späte Antwort, aber für alle, die noch suchen ...

Wie @Emyr sagt, unterstützt SQL 2016 das Abfragen innerhalb von JSON-Spalten mit JSON_VALUE- oder OPENJSON-Anweisungen.

Entity Framework unterstützt dies nicht direkt, aber Sie können die SqlQuery-Methode verwenden, um direkt einen Raw-SQL-Befehl für die Datenbank auszuführen, der innerhalb von JSON-Spalten abfragen und die Abfrage und Deserialisierung jeder Zeile speichern kann, um eine einfache Abfrage auszuführen.

    
Nich Overend 28.10.2017 00:36
quelle