Вопрос

Возможно, я просто избалован 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.

Спасибо!

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top