使用唯一键将记录插入XML表

时间:2009-07-22 06:48:59

标签: insert linq-to-xml primary-key xelement

也许我只是被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方法的解决方案。

谢谢!

1 个答案:

答案 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”之外的东西,它会破坏 - 但它似乎现在可以正常工作。

欢迎评论。