Domanda

Forse sto solo viziato da SQL, ma c'è un modo fresco LINQ per inserire un nuovo record in una "tabella XML" e avere l'aggiornamento ID indicizzato automaticamente (o almeno semi-automatico)?

Ecco cosa intendo per "tabella XML":

<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 questo caso, la tabella è "myElements" e le registrazioni sono gli elementi "MyElement" (vale a dire, i figli di myElements).

L'elemento "id" è definito come chiave nello schema, quindi si comporta più o meno come una "chiave primaria", proprio come sarebbe in SQL.

Quindi, la mia domanda è: come faccio ad inserire un nuovo "MyElement" dove l'elemento "value" è "qualunque" e l'elemento "id" viene impostato automaticamente al successivo id disponibili (in questo esempio, sarebbe max (id) + 1 = 10).

Io ho la mia base di dati XML memorizzati in un XDocument, quindi mi piacerebbe una soluzione che utilizza LINQ e / o metodi di XElement.

Grazie!

È stato utile?

Soluzione

Bene, dal momento che tutte le mie tabelle hanno un elemento chiamato "id", sono stato in grado di scrivere un elemento GetNextAvailableId abbastanza generico. Quindi, ecco come la mia routine inserto avrebbe funzionato per la tavola "MyElement".

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;
}

Non mi sento troppo grande di questa soluzione - si romperà se mai decidessi di chiamare il mio ID qualcosa oltre "id" - ma sembra che funzionerà per ora

.

Commenti di benvenuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top