使用IN子句参数化DocumentDB查询

时间:2015-10-30 06:51:53

标签: c# azure-cosmosdb

我有一个类似下面的查询,我正在尝试参数化:

List<string> poiIDs = /*List of poi ids*/;
List<string> parameterNames = /*List of parameter names*/;

string inClause = string.Join(",", parameterNames);

string query = string.Format("SELECT c.id AS poiID, c.poiName, c.latitude, c.longitude FROM c WHERE c.clusterName = @clusterName AND c.id IN ({0}) AND c.deleted = false", inClause);

IQueryable<POI> queryResult = Client.CreateDocumentQuery<POI>(Collection.SelfLink, new SqlQuerySpec
            {
                QueryText = query,
                Parameters = new SqlParameterCollection()
                {
                    new SqlParameter("@clusterName", "POI"),
                    // How do I declare the dynamically generated parameters here
                    // as new SqlParameter()?
                }
             });

如何为SqlQuerySpec的Parameters属性声明动态生成的参数作为新的SqlParameter()以创建我的文档查询?

4 个答案:

答案 0 :(得分:1)

您可以像这样创建动态参数化查询:

export

答案 1 :(得分:0)

DocumentDB SDK不支持参数化IN查询。

从上面评论中的SO thread来看,SQL也没有。如其他线程中所述,您可以使用LINQ作为解决方法。

答案 2 :(得分:0)

以下为您提供SQL查询,然后您可以在DocumentDB Collection中运行,以通过其ID获取文档。

var query = $"SELECT * FROM p WHERE p.id IN ('{string.Join("', '", arrayOfIds)}')";

答案 3 :(得分:0)

为什么不使用ArrayContains方法?这是节点中的一个例子

sqlQuery = {
        query: 'SELECT * FROM t WHERE ARRAY_CONTAINS(@idList, t.id)',
        parameters: [
            {
                name: '@idList',
                value: ['id1','id2','id3'],
            },
        ],
    };