具有复杂类型的azure表存储

时间:2017-09-09 15:16:39

标签: azure azure-table-storage

当对象包含表实体对象列表时,我对如何从azure表中获取对象感到困惑。这是我想要存储的一个例子

SELECT COUNT(DISTINCT email) FROM (
  SELEC firstColumn AS email FROM table 
  UNION 
  SELEC secondColumn AS email FROM table
  UNION
  SELEC thirdColumn AS email FROM table) AS Recipients

现在我正在尝试按用户ID进行分区,然后每个类1都有一个id的行键,这样我就可以获得给定用户的public class Class1 : TableEntity { public string Property1 { get; set; } public string Property2 { get; set; } public List<Class2> Items { get; set; } } public class Class2 : TableEntity { public string Property1 { get; set; } public string Property2 { get; set; } } 列表,或者我可以得到单{ {1}}通过了解用户和id来对象。我来自一个sql世界,对于桌面存储来说是全新的,所以我可能会错误地考虑这一切。

当我尝试将class1保存到表存储时,除列表外,所有内容都会保存。什么是存储1类对象的最佳方法?这甚至是可能的。我也想也许我不应该将列表存储在与主对象相同的表中。我有一些场景,我需要编辑列表中的单个项目,但是如果我将它们全部存储在一个表格中,我将需要拉出整个对象并从列表中找到我要编辑的项目并将其放入整个物体回来了。

我一直在开始使用azure表存储指南,但对于我在这里看到的场景似乎没有任何意义。

1 个答案:

答案 0 :(得分:3)

列表不是受支持的表存储类型,也不是.net中的任何其他集合,Ienumerable类型。您可以将list属性转换为Json字符串,然后就可以了。当然你可以将整个对象转换为json字符串并写入表,但这就像使用像blob存储一样的azure表存储。您还可以将azure cosmos db与文档db数据模型(json)一起考虑。您可以像创建json doc一样编写列表和其他属性类型,并将其保存到azure cosmos db。

可能是我要做的另一个注释是,只要您的复杂类型没有IEnumerable,ICollection类型属性,实际上可以将复杂类型写入和读取到azure表存储。所以你可以拥有一个对象A,它可能具有复杂类型B和C的属性,它们可能有自己的属性等。将这些类型的对象写入和读取到表存储的方法是使用最近添加的TableEntity.FlattenConvertBack方法(&gt; v8.0.0.0 of Azure Storage .NET SDK)。

这些api将处理使用嵌套复杂属性展平复杂对象,并在透明地从azure表存储中读取时将原始复杂对象转换回来。需要注意的是,它们不支持IEnumerableICollection类型属性。关于将复杂类型写入表存储的主题,我仍然认为这样做会很好。

<强>更新 我扩展了ObjectFlattenerRecomposer Nuget包(它是Azure Storage SDK中TableEntity.Flatten / ConvertBack<T> api的原始源代码),以支持IEnumerable类型。因此,程序包的工作原理与下面解释的展平/重构复杂对象完全相同,但它现在也处理IEnumerables。

您可以在此处试用:https://www.nuget.org/packages/ObjectFlattenerRecomposer/