Inserindo registros em uma tabela XML com uma chave única
-
18-09-2019 - |
Pergunta
Talvez eu esteja apenas estragado pelo SQL, mas há alguma maneira legal LINQ para inserir um novo registro em uma "tabela XML" e ter a atualização ID indexada automaticamente (ou pelo menos semi-automaticamente)? ??
Aqui está o que quero dizer com "tabela 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>
Neste caso, a tabela é "myElements" e os registros são os elementos "MyElement" (isto é, os filhos de myElements).
O elemento "id" é definido como uma chave no esquema, por isso age mais ou menos como uma "chave primária", exatamente como faria em SQL.
Então, minha pergunta é: como faço para inserir um novo "meuElemento" onde o elemento "valor" é "o que" e o elemento "id" é automaticamente ajustado para o próximo ID disponível (neste exemplo, seria max (ID) + 1 = 10).
Eu tenho meu banco de dados XML armazenados em um XDocument, então eu gostaria de uma solução que usa LINQ e / ou métodos de XElement.
Obrigado!
Solução
Bem, já que todas as minhas tabelas têm um elemento chamado "id", eu era capaz de escrever um elemento GetNextAvailableId bastante genérico. Então, aqui está como minha rotina inserção iria trabalhar para a tabela "meuElemento".
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;
}
Eu não me sinto muito grande sobre esta solução - que vai quebrar se eu decidir ligar para o meu ID algo além de "id" -., Mas parece que ele vai trabalhar para agora
Comentários bem-vindos.