在Linq to XML中为新Xelement生成id的最佳方法是什么?

时间:2014-01-13 03:36:00

标签: c# asp.net xml database linq

我一直在使用guid来识别xml文档中的元素以进行编辑。似乎guid比只是一个id领域更多的空间。在sql中有自动增量。是否有类似或适当的方法来自动增加Linq到XML中的xml元素?

唯一的限制可能是,一旦使用了数字,就无法再次使用。

感谢。

2 个答案:

答案 0 :(得分:3)

我不知道“最佳”方式是什么,但我认为使用GUID将是获取ID字段唯一值的可靠方法。

如果你想要一个使用较小数字的替代方法,你可以尝试每次插入前检查文件,并获得比上一个更大的下一个可用ID:

private int GenerateNextId()
{
   var file = XDocument.Load("yourFile.xml");  // or pass an XDocument in
                                               // so you don't have to reload it

   return file.Descendants("SomeElement")
              .OrderByDescending(x => Convert.ToInt32(x.Attribute("ElementId").Value))
              .Select(x => Convert.ToInt32(x.Attribute("ElementId").Value))
              .FirstOrDefault() + 1;
}

这只是作为替代方案发布的。我不知道这是多么有效,因为你的XML增长了。 YMMV


如果您决定继续使用GUID,可以采用缩短方法,例如this SO post

Convert.ToBase64String(Guid.NewGuid().ToByteArray());

我试了一下 - 生成的ID几乎减少了一半:

0b427c5a-1541-4cb4-8995-4e67dac61654
WnxCC0EVtEyJlU5n2sYWVA==

d1205a49-f64b-4418-8449-b1cd52f06624
SVog0Uv2GESESbHNUvBmJA==

答案 1 :(得分:0)

我同意@GrantWinney认为GUID是获取唯一身份证的绝对方法。

但是,您也可以使用DateTime.Now.ToFileTimeUtc();。但是,它并不能保证是唯一的,例如GUID:例如:不同时区的计算机使用此方法添加XML记录,甚至是同一办公室中的不同计算机。