Вставка записей в таблицу XML с уникальным ключом - PullRequest
1 голос
/ 22 июля 2009

Может быть, я просто избалован 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» автоматически устанавливается на следующий доступный id (в этом примере это будет max (id) + 1 = 10).

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

Спасибо!

1 Ответ

0 голосов
/ 23 июля 2009

Что ж, поскольку во всех моих таблицах есть элемент с именем "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" - но похоже, что пока оно будет работать.

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

...