也许我只是通过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的儿童)。

“标识”元素被定义为在模式中的密钥,所以它的行为或多或少为“主键”,就像它会在SQL。

所以,我的问题是,我怎么插入新的“myElement”,其中“值”元素是“无所谓”和“ID”元素被自动设置为下一个可用的ID(在这个例子中,这将是最大值(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以外的东西“ID”这将打破 - 但是看起来它会为现在的工作。

评论欢迎。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top