我是NoSql概念的新手。出于"ModelFirst“的心态,我通常会先设计我的模型。我有一个如下的模型。
public class Book
{
public string Name { get; set; }
[EntityPropertyConverter(typeof(Category))]
public List<Category> Categories { get; set; }
}
public class Category
{
public string Name { get; set; }
}
学生类是一个复杂的类型,
[EntityPropertyConverter]
属性有助于在写入Azure Table之前序列化类别,并在读回时反序列化。
一本书可以属于多个类别。我的问题是,如果有人必须通过n个类别中的一个来搜索一本书,我们如何才能做到这一点。
Azure Table支持如下查询
TableQuery.GenerateFilterCondition("Categories", QueryComparisons.Equal, JsonConvert.SerializeObject(???))
但是这样我就不能得到所需的结果。
如果我的总体方法不正确,请发表评论。
发布于 2018-05-31 17:25:07
有一种方法可以将复杂的对象写入和查询到表存储中,这是SDK中的TableEntity.Flatten
方法,它首先将对象扁平化。TableEntity.ConvertBack
方法将其读回并转换为原始复杂对象。它不执行完全序列化,它将本机属性保留为扁平化对象上的EntityProperty
,以便可以单独查询每个属性。
也就是说,当前版本的TableEntity.Flatten
api不支持IEnumerable/ICollection
类型的属性。但是,nuget package Object Flattener 2.0版支持集合/可枚举/索引类型属性:
https://www.nuget.org/packages/ObjectFlattenerRecomposer/
因此,如果您的对象具有这些类型的索引/可枚举类型属性,则可以使用此nuget将复杂类型写入表存储。这个nuget包做的事情与SDK中的api相同(它是TableEntity.Flatten
/ ConvertBack
方法背后的原始代码),但除此之外,它会在写入表存储之前将可枚举/集合类型的属性转换为json字符串,并且在透明地从表读取时创建原始复杂对象,您无需担心将扁平对象反序列化为原始复杂类型。
回到您最初的问题,可以通过我在SDK中提到的方法或ObjectFlattenerRecomposer api的最新nuget包将复杂对象写入和读取到表存储中。但是,如果您想从列表类型属性中查询单个对象,这仍然很棘手,因为我提到的列表将是表上的json字符串格式。
https://stackoverflow.com/questions/50158670
复制相似问题