Cosmos DB .NET SDK 按动态字段排序(参数化)
Cosmos DB .NET SDK order by a dynamic field (parameterized)
我使用 .NET SDK 检索 Cosmos DB 实例中的一些项目,使用 continuationTokens 能够检索分页数据。到目前为止这有效。
我使用通用的 Get 函数来检索项目:
var query = container.GetItemQueryIterator<T>(
new QueryDefinition("SELECT * FROM c"),
continuationToken: continuationToken,
requestOptions: new QueryRequestOptions()
{
MaxItemCount = itemCount
});
但是我想添加一个动态的按字段排序,被调用者可以在其中决定应该对结果排序的字段。我尝试添加一个参数化字段,如:
new QueryDefinition("SELECT * FROM c order by @orderBy")
.WithParameter("@orderBy", "fieldname")
但这不起作用,我在执行时不断出现语法错误,是否真的可以动态添加 order by 子句?
.WithParameter() 流畅语法只能与 QueryDefinition 中的 WHERE 子句一起使用,因此您必须使用动态附加到 sql 字符串的顺序来构建 sql。
要记住的一件事是,除非这是数据少于 20GB 的小型工作负载,否则除非您在查询中使用分区键,否则此容器不会扩展。这里的另一个考虑因素是,当您使用复合索引时,order by 会获得更好的性能。但是,如果可以根据大量属性对结果进行排序,则所有单个复合索引的写入可能会变得非常昂贵。
在所有情况下,如果这是为了扩展,您应该衡量和基准化高并发操作。
我使用 .NET SDK 检索 Cosmos DB 实例中的一些项目,使用 continuationTokens 能够检索分页数据。到目前为止这有效。
我使用通用的 Get 函数来检索项目:
var query = container.GetItemQueryIterator<T>(
new QueryDefinition("SELECT * FROM c"),
continuationToken: continuationToken,
requestOptions: new QueryRequestOptions()
{
MaxItemCount = itemCount
});
但是我想添加一个动态的按字段排序,被调用者可以在其中决定应该对结果排序的字段。我尝试添加一个参数化字段,如:
new QueryDefinition("SELECT * FROM c order by @orderBy")
.WithParameter("@orderBy", "fieldname")
但这不起作用,我在执行时不断出现语法错误,是否真的可以动态添加 order by 子句?
.WithParameter() 流畅语法只能与 QueryDefinition 中的 WHERE 子句一起使用,因此您必须使用动态附加到 sql 字符串的顺序来构建 sql。
要记住的一件事是,除非这是数据少于 20GB 的小型工作负载,否则除非您在查询中使用分区键,否则此容器不会扩展。这里的另一个考虑因素是,当您使用复合索引时,order by 会获得更好的性能。但是,如果可以根据大量属性对结果进行排序,则所有单个复合索引的写入可能会变得非常昂贵。
在所有情况下,如果这是为了扩展,您应该衡量和基准化高并发操作。