Pregunta

Tal vez estoy mal acostumbrado a SQL, pero ¿hay alguna manera fresca LINQ para insertar un nuevo registro en una "tabla XML" y tienen el identificador de actualización automática indexada (o al menos semi-automática)?

Esto es lo que quiero decir con "tabla 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>

En este caso, la mesa es "myElements" y los registros son los elementos "MyElement" (es decir, los hijos de myElements).

El elemento "id" se define como una clave en el esquema, por lo que actúa más o menos como una "clave primaria", al igual que lo haría en SQL.

Por lo tanto, mi pregunta es, ¿Cómo se inserta un nuevo "myElement", donde el elemento de "valor" es "lo que sea" y el elemento "Identificación" se ajusta automáticamente a la siguiente ID disponible (en este ejemplo, sería max (id) + 1 = 10).

Tengo mi base de datos XML almacenados en una XDocument, así que me gustaría una solución que utiliza LINQ y / o métodos de XElement.

Gracias!

¿Fue útil?

Solución

Bueno, ya que todos mis cuadros tienen un elemento llamado "id", yo era capaz de escribir un elemento GetNextAvailableId bastante genérico. Así pues, aquí es como mi rutina de inserción trabajaría para la tabla "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;
}

No me siento demasiado grande acerca de esta solución - que se romperá si alguna vez decido llamar a mi ID algo además de "id" -, pero parece que va a trabajar por ahora

.

Comentarios de bienvenida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top