.NET 3.5, C#Kann LINQ to SQL ein XML-Feld DB-serverseitig abfragen?
Ich habe eine Web-App mit einer "Suche" -Funktion. Einige der Felder, die durchsucht werden können, sind erstklassige Spalten in der Tabelle, aber einige von ihnen sind tatsächlich verschachtelte Felder innerhalb eines XML-Datentyps.
Zuvor baute ich ein System für die dynamische Erstellung der SQL für meine Suche. Ich hatte eine nette Klassenhierarchie, in der SQL-Ausdrücke und bedingte Anweisungen erstellt wurden. Das einzige Problem war, dass es vor SQL-Injection-Angriffen nicht sicher war.
Ich lese ausgezeichneten Artikel Rob Conery (http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/), die das aufgezählt wird nie, wenn das IQueryable Ergebnis für den Server in eine einzige TSQL Abfrage kombiniert können mehrere Abfragen hingewiesen. Das brachte mich dazu zu denken, dass meine dynamische Suchkonstruktion viel zu kompliziert war - ich musste nur mehrere LINQ-Ausdrücke kombinieren.
Zum Beispiel (erfundene):
Autor: ID (int), Name VZ (varchar (32)), Vorname (varchar (32))
context.Author.Where(xx => xx.LastName == "Smith").Where(xx => xx.FirstName == "John")
Ergebnisse in der folgenden Abfrage:
Ich erkannte, dass dies die perfekte Lösung für eine einfache dynamische Abfrage Generation, die sicher von SQL ist injection - Ich würde einfach mein IQueryable-Ergebnis durchlaufen und zusätzliche Konditionalausdrücke ausführen, um meinen letzten Ausdruck für die Einzelausführung zu erhalten.
Ich kann jedoch keine Unterstützung für die Auswertung von XML-Daten finden. In TSQL, einen Wert aus einem XML-Knoten erhalten, würden wir so etwas wie
XMLField.value('(*:Root/*:CreatedAt)[1]', 'datetime') = getdate()
tun, aber ich kann nicht die LINQ to SQL-äquivalent von der Erstellung dieser Auswertung finden. Gibt es einen? Ich weiß, dass ich alle Nicht-XML-Bedingungen DB-Seite auswerten kann, und dann meine XML-Auswertungscodeseite, aber meine Daten sind groß genug, dass A) viel Netzwerkverkehr ist, um die Leistung zu beeinträchtigen, und B) ich werde von Speicherausnahmen, wenn ich die XML-DB-Seite nicht auswerten kann, um bestimmte Ergebnismengen auszuschließen.
Ideen? Vorschläge?
Bonus Frage - Wenn XML Auswertung tatsächlich möglich ist DB Seite, was ist mit FLWOR Unterstützung?
es ist das Ende des Jahres 2013 - alle Updates? –
@BenjaminGruenbaum Es ist lange her, seit ich über diese Frage nachgedacht habe. Mein Anwendungsfall dafür verschwand, als ich den Job zwischen damals und heute wechselte. Am besten, wie ich mich erinnern kann, habe ich den unten empfohlenen Ansatz DanialM verwendet, um eine benutzerdefinierte Funktion aufzurufen. Kann ich nicht sagen, da ich seit damals direkte Unterstützung in LINQ bemerkt habe (aber ich habe auch nicht gesucht) – Matt
Interessant - Ich werde versuchen, neue Antworten 5 Jahre später mit einer Prämie zu fischen. –