也许我只是被SQL所破坏,但是有一些很酷的LINQ方法可以将新记录插入“XML表”并自动更新索引ID(或至少半自动更新)?
这就是我所说的“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”元素为“whatever”,而“id”元素自动设置为下一个可用的id(在本例中,它将是max(id)+ 1 = 10)。
我的XML数据库存储在XDocument中,所以我想要一个使用LINQ和/或XElement方法的解决方案。
谢谢!
答案 0 :(得分: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称为除“id”之外的东西,它会破坏 - 但它似乎现在可以正常工作。
欢迎评论。