DocumentDB SQL Query在Query Explorer中工作,但在C#代码中不起作用

时间:2016-09-07 12:56:07

标签: c# sql azure-cosmosdb

我希望将文件中存储的变量(InputAssetId)的值作为字符串获取。写入查询。它在QueryExplorer中工作正常。

 this.client = new DocumentClient(new Uri(EndpointUri), PrimaryKey);
 IQueryable<asset> id = this.client.CreateDocumentQuery<asset>(
               UriFactory.CreateDocumentCollectionUri(DatabaseName,CollectionName),
               "SELECT c.InputAssetId FROM c WHERE c.BlobNameDb='BigBuckBunny.mp4' ");
 Console.WriteLine( id.string());

而不是存储在变量中的值,我在控制台中得到的内容在下面给出

{"query":"SELECT c.InputAssetId FROM c WHERE c.BlobNameDb='BigBuckBunny.mp4' "}

任何人都可以给我一个解决方案吗?

2 个答案:

答案 0 :(得分:1)

问题是您实际上并没有执行您创建的查询。正确的代码将是这样的:

this.client = new DocumentClient(new Uri(EndpointUri), PrimaryKey);
var query = this.client.CreateDocumentQuery<asset>(
         ... your LiNQ or SQL query...
    .AsDocumentQuery();

var result = await query.ExecuteNextAsync<string>();
Console.WriteLine(result.ToList().FirstOrDefault());

您可能希望在查询中使用TOP 1(而不是FeedOptions.MaxItemCount = 1,因为后者命名错误 - 它实际上意味着最多返回每个Feed请求的项目数。使用低MaxItemCount可能会导致大量无用的查询。)

答案 1 :(得分:0)

好吧,我仍然不了解所有API,但我会将Linq与C#一起使用。 `。

你应该用这种方式写或多或少:

FeedOptions queryOptions = new FeedOptions { MaxItemCount = 1 };

IQueryable<Asset> assetQuery = client.CreateDocumentQuery<Asset>(UriFactory.CreateDocumentCollectionUri(DatabaseName, CollectionName),

queryOptions)         .Where(o =&gt; o.BlobNameDb ==&#34; BigBuckBunny.mp4&#34;);

string id = assetQuery.First().InputAssetId ;

从我在documentation中您想要使用SQL查询的内容中,您必须将其作为SqlQuerySpec传递,以便您的代码可以成为(虽然没有对该解决方案进行测试) :

IQueryable<string> assetQuery = client.CreateDocumentQuery<Asset>(
          UriFactory.CreateDocumentCollectionUri(DatabaseName, CollectionName), 
          new SqlQuerySpec("SELECT c.InputAssetId FROM c WHERE c.BlobNameDb='BigBuckBunny.mp4'"),
          queryOptions)
string id = assetQuery.First();