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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top