2009-07-22 2 views
1

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

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

Спасибо!

ответ

0

Ну, так как все мои таблицы имеют элемент с именем «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 что-то, кроме «ид» - но мне кажется, что это будет работать на данный момент.

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

 Смежные вопросы

  • Нет связанных вопросов^_^