Insertion d'enregistrements dans une table XML avec une clé unique
-
18-09-2019 - |
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!
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.