1

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

谢谢!

4

1 回答 1

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”之外的其他东西,它会中断——但它现在似乎可以工作。

欢迎评论。

于 2009-07-22T23:02:10.230 回答