Class DocumentDb 中的继承
Class inheritance in DocumentDb
我正在尝试找出在 DocumentDb 中建模 class 继承的最佳方法。
假设我的 classes 结构为
class A
property X
property Y
property Z
class B inherits from A
property W
是否有内置支持来处理这个问题?如果我在客户端代码中使用 Lambda 表达式,它们是否能够自动区分类型?
请问下面只查询return个B类型的对象吗?或者它也会考虑基础实例 class A?
var bCollection = from o in client.CreateDocumentQuery<B>(collectionLink)
where X > 2
select o;
我使用 node.js 而不是 .NET,所以我不认识 CreateDocumentQuery<B>
语法。有没有一种方法可以检查 .NET SDK 发送的实际查询,以查看 WHERE 子句中是否添加了某些内容以将结果限制为类型 B?或者,是否有像 _Type
这样的字段在没有您干预的情况下添加到您的文档中?我非常怀疑您提供的查询子句是否经过了如此修改。我不太确定没有添加 _Type
字段,但我认为它的可能性小于 50%。我的直觉只是 CreateDocumentQuery
上的 <B>
规范只是为您将返回的对象转换为类型 B。我不知道如果您的结果集包含 class A 对象,或者它是否会使用 null 或其他一些默认值来缺少字段,这是否会导致错误。
假设以上所有情况,您可能必须自己建模 class 层次结构。我用两种不同的方式对此进行了建模:
使用实体化数组来指示每个文档的整个 class 层次结构。所以,["Animal"、"Mammal"、"Cat"]。然后当你想要所有哺乳动物时,你可以用 WHERE "Mammal" IN c.class
.
查询
最近,我转而为每种类型设置一个单独的字段。因此,isAnimal = true
、isMammal = true
和 isCat = true
。这更像是一种混合方法,但您仍然可以通过这种方式对 class 层次结构进行建模。
有内置支持吗?如果我在我的客户端代码中使用 Lambda 表达式,它是否能够自动区分 b/w 类型?
是的,你可以在客户端使用 lambda 语法,只要你在泛型方法中指定特定类型,如 client.CreateDocumentQuery<YourType>(collectionLink)
。
下面的查询只会带回类型B的对象吗?或者它也会考虑基础实例 class A?
DocumentDB 是无模式存储,不存储类型信息。客户端提供的重载泛型方法是语法糖,让您轻松创建查询。
所有查询都是针对 json 文档进行评估的,这些文档没有类型信息。
继承场景
因此,如果您针对仅存在于派生 class 中的 属性 发出查询,您将获得仅与派生 class 相对应的值。但是,如果您要查询的 属性 在基础 class 和派生 class 中,您将得到这两个结果。例如,在你的情况下,过滤 W
只会给你 class B
的结果,但过滤 X, Y or Z
会给你两个 classes 的值A
和 B
.
类 在同一集合中具有共享模式
请注意,这不仅仅发生在基础派生的 class 场景中。如果您 有 2 个独立的 classes,它们不会相互继承,但有一个同名的 属性,则会发生相同的行为。查询 属性 将 return 两个 class 的结果。
例如,如果您有 2 个 class 存储在同一个集合中:
class A1 { int x; }
class A2 { int x; }
即使您使用 client.CreateDocumentQuery<A1>(collectionLink)
形成查询,class A 和 B 的结果都将被 return 编辑。正如我之前提到的,客户端中的类型规范只是为了让您在形成查询时更轻松。
我希望能够查询不同类型的数据,具有共享模式元素,存储在同一个集合中 - 我建议使用单独的 属性 来手动存储类型信息并对其进行过滤属性.
class DocumentDbData
{
string DataType;
DocumentDbData(string type) { DataType = type;}
}
class A1 : DocumentDbData
{
string x;
A1() : base("A1")
}
class A2 : DocumentDbData
{
string x;
A2() : base("A2")
}
查询 client.CreateDocumentQuery<A1>(collectionLink).Where(d => d.DataType == "A1" && d.x == "xvaluefilter")
现在 return 只有 class A1 的数据。
我正在尝试找出在 DocumentDb 中建模 class 继承的最佳方法。 假设我的 classes 结构为
class A
property X
property Y
property Z
class B inherits from A
property W
是否有内置支持来处理这个问题?如果我在客户端代码中使用 Lambda 表达式,它们是否能够自动区分类型?
请问下面只查询return个B类型的对象吗?或者它也会考虑基础实例 class A?
var bCollection = from o in client.CreateDocumentQuery<B>(collectionLink)
where X > 2
select o;
我使用 node.js 而不是 .NET,所以我不认识 CreateDocumentQuery<B>
语法。有没有一种方法可以检查 .NET SDK 发送的实际查询,以查看 WHERE 子句中是否添加了某些内容以将结果限制为类型 B?或者,是否有像 _Type
这样的字段在没有您干预的情况下添加到您的文档中?我非常怀疑您提供的查询子句是否经过了如此修改。我不太确定没有添加 _Type
字段,但我认为它的可能性小于 50%。我的直觉只是 CreateDocumentQuery
上的 <B>
规范只是为您将返回的对象转换为类型 B。我不知道如果您的结果集包含 class A 对象,或者它是否会使用 null 或其他一些默认值来缺少字段,这是否会导致错误。
假设以上所有情况,您可能必须自己建模 class 层次结构。我用两种不同的方式对此进行了建模:
使用实体化数组来指示每个文档的整个 class 层次结构。所以,["Animal"、"Mammal"、"Cat"]。然后当你想要所有哺乳动物时,你可以用
WHERE "Mammal" IN c.class
. 查询
最近,我转而为每种类型设置一个单独的字段。因此,
isAnimal = true
、isMammal = true
和isCat = true
。这更像是一种混合方法,但您仍然可以通过这种方式对 class 层次结构进行建模。
有内置支持吗?如果我在我的客户端代码中使用 Lambda 表达式,它是否能够自动区分 b/w 类型?
是的,你可以在客户端使用 lambda 语法,只要你在泛型方法中指定特定类型,如 client.CreateDocumentQuery<YourType>(collectionLink)
。
下面的查询只会带回类型B的对象吗?或者它也会考虑基础实例 class A?
DocumentDB 是无模式存储,不存储类型信息。客户端提供的重载泛型方法是语法糖,让您轻松创建查询。 所有查询都是针对 json 文档进行评估的,这些文档没有类型信息。
继承场景
因此,如果您针对仅存在于派生 class 中的 属性 发出查询,您将获得仅与派生 class 相对应的值。但是,如果您要查询的 属性 在基础 class 和派生 class 中,您将得到这两个结果。例如,在你的情况下,过滤 W
只会给你 class B
的结果,但过滤 X, Y or Z
会给你两个 classes 的值A
和 B
.
类 在同一集合中具有共享模式
请注意,这不仅仅发生在基础派生的 class 场景中。如果您 有 2 个独立的 classes,它们不会相互继承,但有一个同名的 属性,则会发生相同的行为。查询 属性 将 return 两个 class 的结果。 例如,如果您有 2 个 class 存储在同一个集合中:
class A1 { int x; }
class A2 { int x; }
即使您使用 client.CreateDocumentQuery<A1>(collectionLink)
形成查询,class A 和 B 的结果都将被 return 编辑。正如我之前提到的,客户端中的类型规范只是为了让您在形成查询时更轻松。
我希望能够查询不同类型的数据,具有共享模式元素,存储在同一个集合中 - 我建议使用单独的 属性 来手动存储类型信息并对其进行过滤属性.
class DocumentDbData
{
string DataType;
DocumentDbData(string type) { DataType = type;}
}
class A1 : DocumentDbData
{
string x;
A1() : base("A1")
}
class A2 : DocumentDbData
{
string x;
A2() : base("A2")
}
查询 client.CreateDocumentQuery<A1>(collectionLink).Where(d => d.DataType == "A1" && d.x == "xvaluefilter")
现在 return 只有 class A1 的数据。