Вставка записей в XML-таблицу с уникальным ключом

Может быть, я просто избалован SQL, но есть ли какой-нибудь классный способ LINQ для вставки новой записи в «таблицу XML» и автоматического (или, по крайней мере, полуавтоматического) обновления индексированного идентификатора?

Вот что я имею в виду под «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>

В этом случае таблица — это «myElements», а записи — это элементы «myElement» (т. е. дочерние элементы myElements).

Элемент «id» определен как ключ в схеме, поэтому он действует более или менее как «первичный ключ», точно так же, как в SQL.

Итак, мой вопрос: как мне вставить новый «myElement», где элемент «value» является «любым», а элемент «id» автоматически устанавливается на следующий доступный идентификатор (в этом примере это будет max (id ) + 1 = 10).

Моя база данных XML хранится в XDocument, поэтому мне нужно решение, использующее LINQ и/или методы XElement.

Спасибо!


person devuxer    schedule 22.07.2009    source источник


Ответы (1)


Что ж, поскольку во всех моих таблицах есть элемент с именем «id», я смог написать довольно общий элемент GetNextAvailableId. Итак, вот как моя процедура вставки будет работать для таблицы «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;
}

Я не слишком доволен этим решением — оно сломается, если я когда-нибудь решу назвать свой идентификатор как-то иначе, чем «id», — но похоже, что на данный момент оно будет работать.

Комментарии приветствуются.

person devuxer    schedule 22.07.2009