gpt4 book ai didi

c# - 适用于 CosmosDb 的 SqlQuerySpec QueryBuilder

转载 作者:太空狗 更新时间:2023-10-30 01:29:56 27 4
gpt4 key购买 nike

我们确实必须从 Linq-Queries 迁移到 DocumentDB/CosmosDB。

原因主要有两个用例:

  • 部分选择 - 文档至少有一个大字段,我只想在某些情况下返回该字段。直接指定字段可以节省RU成本。我无法在 Linq 中实现这一点。
  • 像这样连接(示例有点奇怪)。

        SqlQuerySpec spec = new SqlQuerySpec(@"
    SELECT value(n)
    FROM books b
    join p in b.author.parents
    where b.isbn = @isbnId
    AND lower(p.address.street) = @parentStreet
    ");

所以我们的查询看起来像这样:

IQueryable<Book> queryable = client.CreateDocumentQuery<Book>(
collectionSelfLink,
new SqlQuerySpec
{
QueryText = "SELECT * FROM books b WHERE (b.Author.Name = @name)",
Parameters = new SqlParameterCollection()
{
new SqlParameter("@name", "Herman Melville")
}
});

但是,随着我们的要求变得越来越复杂,我们需要根据给定的参数使查询看起来有所不同。我们还有“in”查询,要求我们添加多个参数。

现在我们的代码看起来像这样......

        var sqlParameterCollection = new SqlParameterCollection();
for (int i = 0; i < ids.Length; i++)
{
var key = "@myid" + i;
sqlParameterCollection.Add(new SqlParameter(key, ids[i]));
}
[...]
var query = $@"
{select}
FROM collection m
WHERE m.myid IN ({string.Join(",", sqlParameterCollection.Select(p => p.Name))})
";

接下来,where 子句需要根据某些参数使用附加过滤器进行扩展

由于情况变得越来越糟:有可用的查询构建器吗?我正在考虑一个流畅的 API,理想情况下还可以包含 SqlParameters,而不仅仅是查询文本。 p>

伪代码:

queryBuilder
.from("m")
.select("field1")
.select("field2")
.where("myid", Operators.In, ...)
.And(...

最佳答案

您必须将 IN 查询重写为 ARRAY_CONTAINS 查询。然后您可以轻松地参数化参数。

例如,SELECT * FROM book WHERE book.isbn IN (1,2,3) 应重写为 SELECT * FROM book WHERE ARRAY_CONTAINS(@bookIsbnList, Book.ISBN) @bookIsbnList = [1,2,3]

对于您原来的问题,LINQ 应该是更复杂场景的查询构建器。您能详细说明一下您为什么要搬走吗?

关于c# - 适用于 CosmosDb 的 SqlQuerySpec QueryBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48870845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com