Frage

Vielleicht bin ich nur von SQL verdorben, aber gibt es einige coole LINQ Weg, um einen neuen Datensatz in einer „XML-Tabelle“ einzufügen und die indizierte ID Update automatisch (oder zumindest halbautomatisch)?

Hier ist, was ich mit "XML-Tabelle" bedeuten:

<myElements>
    <myElement>
        <id>1</id>
        <value>blah</value>
    </myElement>
    <myElement>
        <id>3</id>
        <value>blah</value>
    </myElement>
    <myElement>
        <id>4</id>
        <value>blah</value>
    </myElement>
    <myElement>
        <id>8</id>
        <value>blah</value>
    </myElement>
    <myElement>
        <id>9</id>
        <value>blah</value>
    </myElement>
</myElements>

In diesem Fall ist die Tabelle "myElements" und die Aufzeichnungen sind die "myElement" Elemente (das heißt, die Kinder myElements).

Das „id“ Element als Schlüssel im Schema definiert ist, so wirkt es mehr oder weniger als „Primärschlüssel“, so wie es würde in SQL.

Also, meine Frage ist, wie füge ich ein neues „myElement“, wo das „Wert“ Element „was auch immer“ und das „id“ Element wird automatisch auf die nächste verfügbare ID (in diesem Beispiel gesetzt, es wäre max (id) + 1 = 10).

Ich habe meine XML-Datenbank in einem XDocument gespeichert, so würde ich eine Lösung wie die LINQ und / oder Methoden des XElement verwendet.

Danke!

War es hilfreich?

Lösung

Nun, da alle meine Tabellen haben ein Element namens „id“, konnte ich ein ziemlich allgemein GetNextAvailableId Element schreiben. Also, hier ist, wie mein Einsatz Routine für die „myElement“ Tabelle funktionieren würde.

public virtual int InsertMyElement(string value)
{
    int id = GetNextAvailableId("myElement");
    TableDictionary["myElement"].Add(
        new XElement(_ns + "myElement",
            new XElement(_ns + "id", id),
            new XElement(_ns + "value", value)));
    return id;
}

public virtual int GetNextAvailableId(string tableName)
{
    IEnumerable<int> ids =
        from
            r in TableDictionary[tableName].Elements()
        select
            int.Parse(r.Element(_ns + "id").Value);
    return ids.Max() + 1;
}

Ich fühle mich nicht zu groß über diese Lösung - es wird brechen, wenn ich jemals meine ID etwas anderes als „id“ entscheiden zu nennen - aber es scheint, wie es jetzt funktioniert

.

Kommentare willkommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top