Question

Peut-être que je suis juste gâté par SQL, mais est-il un moyen LINQ cool d'insérer un nouvel enregistrement dans une « table XML » et que la mise à jour ID indexé automatiquement (ou semi-automatique au moins)?

Voici ce que je veux dire par "table 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>

Dans ce cas, la table est "myElements" et les enregistrements sont les éléments "MyElement" (à savoir, les enfants de myElements).

L'élément « id » est définie comme une clé dans le schéma, il agit plus ou moins comme une « clé primaire », comme il le ferait dans SQL.

Alors, ma question est, comment puis-je insérer un nouveau « myElement » où l'élément « valeur » est « tout » et l'élément « id » est automatiquement réglé sur le prochain ID disponible (dans cet exemple, il serait max (id) + 1 = 10).

J'ai ma base de données XML stockées dans un XDocument, donc je voudrais une solution qui utilise LINQ et / ou méthodes de XElement.

Merci!

Était-ce utile?

La solution

Eh bien, puisque tous mes tableaux ont un élément appelé « id », j'ai pu écrire un élément GetNextAvailableId assez générique. Alors, voici comment ma routine d'insertion travaillerait pour la table « 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;
}

Je ne me sens pas trop grande de cette solution - il cassera si jamais je décide d'appeler mon ID quelque chose en plus « id » - mais il semble que cela va fonctionner pour l'instant

.

commentaires sont les bienvenus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top