c# - 适用于 CosmosDb 的 SqlQuerySpec QueryBuilder

标签 c# .net azure azure-cosmosdb

我们确实必须从 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/

相关文章:

.net - 为什么我在 mono 上收到此消息? "warning FS0191: Could not determine highest installed framework version...".NET”

具有 Websocket 和 AD 身份验证的 Azure 应用服务

c# - 当托管在 Azure 应用服务中时,如何控制添加到 ASP.NET Core Web 应用程序的 HTTP 响应 header ?

c# - DataTable.Load,一行或多行包含违反非空、唯一或外键约束的值

.net - 如何在生产中配置 WCF 客户端?

c# - 并行 For 循环。他们在等待完成吗?

node.js - Azure 表存储性能

Azure Blob 存储生命周期管理

c# - 如何在C#中将'int'转换为'char'?

c# - 排序子集合并返回第一个子集合文档