Вставка записей в XML-таблицу с уникальным ключом
-
18-09-2019 - |
Вопрос
Возможно, я просто избалован 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», — но, похоже, пока оно будет работать.
Комментарии приветствуются.