- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们确实必须从 Linq-Queries 迁移到 DocumentDB/CosmosDB。
原因主要有两个用例:
像这样连接(示例有点奇怪)。
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/
我们确实必须从 Linq-Queries 迁移到 DocumentDB/CosmosDB。 原因主要有两个用例: 部分选择 - 文档至少有一个大字段,我只想在某些情况下返回该字段。直接指定字段可以节省
在查询 CosmosDB 特定文档时,我经常执行 LINQ 谓词。然而,今天我的 CosmosDB 中填满了 10 万多个文档。表演非常缓慢。由于 Azure 门户中的 SQL 查询明显更快,因此我尝
我是一名优秀的程序员,十分优秀!