Benutzer mit den meisten Antworten
Gibt es für XML.LINQ einen CommandBuilder?

Frage
-
Guten Morgen Netzgemeinde,
hab jetzt schon eine ganze Weile gesucht, leider nix gefunden, deshalb meine Frage an Euch.
Zunächst aber erst einmal die Problembeschreibung:
Es geht um die Arbeit mit XML Dateien. An und für sich funktioniert soweit auch alles, aber bekanntlich gibt es nichts, was nicht noch besser gemacht werden konnte. Z. Bsp. in SYSTEM.XML.LINQ so arbeiten zu können wie in SQL.OLEDB. Soll heißen, in OLEDB kann ich ein SQL-Statement zunächst als String generieren (und eben notfalls auch mittels Schleifen bei variabler Anzahl von Spalten, Tabellen, Where-Klauseln) und dann der OLEDB.Command Variable sagen, dass das das auszuführende Kommando ist.
Bei XML vermisse ich das. Bsp.:
var Projekt = XElement.Load(_Datei); IEnumerable<XElement> Abfrage = from p in Projekt.Elements("Projekt") where p.Element("Kunde").Value == Kunde && p.Element("Projektnummer").Value == Projektnummer && p.Element("Projektbezeichnung").Value == ( Convert.ToInt64(Projektbezeichnung) + 1 ).ToString() select p;
Soweit, so gut (bei bekannter Anzahl und Benennung der Elemente), aaaber... gibt es eine Möglichkeit die Anweisung auch variabel zu gestalten?
Vielen Dank schon einmal im voraus!
Ralf
- Bearbeitet Ralf A Samstag, 1. Februar 2014 10:11
Antworten
-
Hallo Ralf,
nein, einen CommandBuilder gibt es nicht.
Schlicht und einfach weil Xml keine Sprache, sondern nur ein Dateiformat ist. Das legt bis auf geringe Anforderungen bezüglich "Wohlgeformtheit" jedoch keinen strengen Rahmen vor.
Xml wird z. B. auch für Html (in der strengen Form) verwendet. Wollte man einen Abfrage-Editor schreiben, so müsste man seinen Aufbau kennen, was mit Xml Schema (XSD) oder auch Relax NG machbar ist, aber nicht immer zur Verfügung steht.
Hilfreich kann dann bestenfalls etwas wie LinqPad sein.
Zur obigen Abfrage: Wenn möglich sollte man mit expliziten Cast arbeiten. Nebenbei vermeidet das Fehler, wenn ein Element nicht existiert - dann würde der Zugriff auf Value wegen null scheitern:
IEnumerable<XElement> Abfrage = from p in Projekt.Elements("Projekt") where (string)p.Element("Kunde") == Kunde && (string)p.Element("Projektnummer") == Projektnummer && (long)p.Element("Projektbezeichnung") == Convert.ToInt64(Projektbezeichnung) + 1 select p;
Anstatt über String-Konstanten kannst Du auf Elemente/Attribute ebenso über Variablen zugreifen.
Oder die Abfrage Stück für Stück zusammenbauen, z. B. weitere Where Kriterien anfügen. Denn im Gegensatz zu SQL ist eine LINQ Abfrage nicht "aus einem Guss", sondern besteht aus einer Aneinanderreihung von Methodenaufrufen.
Gruß Elmar
- Als Antwort markiert Ralf A Samstag, 1. Februar 2014 12:05
Alle Antworten
-
Hallo,
ich kann mir nicht vorstellen, dass man soetwas wirklich dynamisch gestalten kann. In einzelnen Fällen kann es zwar über Reflection realisiert werden, das ist aber vielleicht aufwendiger als gedacht.In .NET ist es meistens so, dass genau bekannt ist, welche Eigenschaften ein Objekt hat. Wenn du Elemente im XML nur prüfen willst, wenn diese auch vorhanden sind, kannst du das vorher abprüfen. Dazu kannst du dir auch eine eigene Methode schreiben. Hier ein Ansatz:
static bool Check(XElement x, string pNummer) { var n = x.Element("Projektnummer"); if (n != null)//Wert vorhanden? if (n.Value != pNummer)//Falscher Wert eingetragen return false; //weitere Abfragen return true;//Alles bestanden }
Die Frage ListCollectionView mit generischem Filter kann dir vielleicht ein wenig in Richtung Reflection weiter helfen. Wobei hier auch zu sehen ist, dass es mehr Aufwand macht als das es einen Nutzen bringt.Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hallo Ralf,
nein, einen CommandBuilder gibt es nicht.
Schlicht und einfach weil Xml keine Sprache, sondern nur ein Dateiformat ist. Das legt bis auf geringe Anforderungen bezüglich "Wohlgeformtheit" jedoch keinen strengen Rahmen vor.
Xml wird z. B. auch für Html (in der strengen Form) verwendet. Wollte man einen Abfrage-Editor schreiben, so müsste man seinen Aufbau kennen, was mit Xml Schema (XSD) oder auch Relax NG machbar ist, aber nicht immer zur Verfügung steht.
Hilfreich kann dann bestenfalls etwas wie LinqPad sein.
Zur obigen Abfrage: Wenn möglich sollte man mit expliziten Cast arbeiten. Nebenbei vermeidet das Fehler, wenn ein Element nicht existiert - dann würde der Zugriff auf Value wegen null scheitern:
IEnumerable<XElement> Abfrage = from p in Projekt.Elements("Projekt") where (string)p.Element("Kunde") == Kunde && (string)p.Element("Projektnummer") == Projektnummer && (long)p.Element("Projektbezeichnung") == Convert.ToInt64(Projektbezeichnung) + 1 select p;
Anstatt über String-Konstanten kannst Du auf Elemente/Attribute ebenso über Variablen zugreifen.
Oder die Abfrage Stück für Stück zusammenbauen, z. B. weitere Where Kriterien anfügen. Denn im Gegensatz zu SQL ist eine LINQ Abfrage nicht "aus einem Guss", sondern besteht aus einer Aneinanderreihung von Methodenaufrufen.
Gruß Elmar
- Als Antwort markiert Ralf A Samstag, 1. Februar 2014 12:05
-
@ Tom
Danke für Deine Antwort! Ich hatte sowas in der Art befürchtet...:(
Um das Überprüfen ging es mir in diesem Fall nicht. Auch wenn .Net die Objekte nicht kennt, in diesem Fall kenne ich sie...;) Aber der Hinweis auf ListCollectionView scheint interessant zu sein.
@Elmar,
...seufz... da muss er durch, der Lurch... aber:
"Denn im Gegensatz zu SQL ist eine LINQ Abfrage nicht "aus einem Guss", sondern besteht aus einer Aneinanderreihung von Methodenaufrufen."
...das könnte ja evtl. ein Lösungsansatz sein... ?
Wie auch immer... besten Dank an Euch Beide! Und... schönes Wochenende!
Ralf