C# DocumentDb DocumentClient获取前25个文档

C# DocumentDb DocumentClient获取前25个文档,c#,azure,azure-cosmosdb,documentclient,C#,Azure,Azure Cosmosdb,Documentclient,开始使用Cosmos和文档db/sql。为什么这不起作用?没有抛出错误,我可以看到。有一些数据应该返回 private const string EndpointUri = "some url"; private const string PrimaryKey = "somekey"; private const string DbId = "People"; private const string CollectionId = "Person"; pr

开始使用Cosmos和文档db/sql。为什么这不起作用?没有抛出错误,我可以看到。有一些数据应该返回

    private const string EndpointUri = "some url";
    private const string PrimaryKey = "somekey";
    private const string DbId = "People";
    private const string CollectionId = "Person";
    private DocumentClient client;

    // GET: api/Person
    [HttpGet]
    public IEnumerable<Person> Get()
    {
        this.client = new DocumentClient(new Uri(EndpointUri), PrimaryKey);
        FeedOptions queryOptions = new FeedOptions { MaxItemCount = 25, EnableCrossPartitionQuery = true };



        IQueryable<Person> personQuery = this.client.CreateDocumentQuery<Person>(
            UriFactory.CreateDocumentCollectionUri(DbId, CollectionId), queryOptions)
            .Where(f => f.NameFirst != "Andersen");

        List<Person> retVal = new List<Person>();
        retVal = personQuery.ToList();
        return retVal;
    }
private const string EndpointUri=“some url”;
private const string PrimaryKey=“somekey”;
private const string DbId=“People”;
private const string CollectionId=“Person”;
私人文件客户;
//获取:api/人
[HttpGet]
公共IEnumerable Get()
{
this.client=newdocumentclient(新Uri(EndpointUri),PrimaryKey);
FeedOptions queryOptions=new FeedOptions{MaxItemCount=25,EnableCrossPartitionQuery=true};
IQueryable personQuery=this.client.CreateDocumentQuery(
CreateDocumentCollectionUri(DbId,CollectionId),queryOptions)
其中(f=>f.NameFirst!=“安达信”);
List retVal=新列表();
retVal=personQuery.ToList();
返回返回;
}

MaxItemCount
是每次枚举操作将获得的最大项目数。它不返回前25个文档,而是返回与此查询匹配的所有文档,每个枚举聚合25个文档

如果您想要前25项,您的代码应该如下所示:

[HttpGet]
public async Task<IEnumerable<Person>> Get()
{
    this.client = new DocumentClient(new Uri(EndpointUri), PrimaryKey);
    FeedOptions queryOptions = new FeedOptions { EnableCrossPartitionQuery = true };

    var personQuery = this.client.CreateDocumentQuery<Person>(
        UriFactory.CreateDocumentCollectionUri(DbId, CollectionId), queryOptions)
        .Where(f => f.NameFirst != "Andersen").Take(25).AsDocumentQuery();

    List<Person> retVal = new List<Person>();

    while(personQuery.HasMoreResults)
    {
        var results = await personQuery.ExecuteNextAsync<Person>();
        retVal.AddRange(results);
    }

    return retVal;
}
[HttpGet]
公共异步任务Get()
{
this.client=newdocumentclient(新Uri(EndpointUri),PrimaryKey);
FeedOptions queryOptions=new FeedOptions{EnableCrossPartitionQuery=true};
var personQuery=this.client.CreateDocumentQuery(
CreateDocumentCollectionUri(DbId,CollectionId),queryOptions)
.Where(f=>f.NameFirst!=“Andersen”).Take(25).AsDocumentQuery();
List retVal=新列表();
while(personQuery.HasMoreResults)
{
var results=await personQuery.ExecuteNextAsync();
retVal.AddRange(结果);
}
返回返回;
}

根据您对集合中字符串的索引方式,您可能还需要将
FeedOptions
对象的
EnableScanInQuery
属性设置为
true

MaxItemCount
是每次枚举操作将获得的最大项数。它不返回前25个文档,而是返回与此查询匹配的所有文档,每个枚举聚合25个文档

如果您想要前25项,您的代码应该如下所示:

[HttpGet]
public async Task<IEnumerable<Person>> Get()
{
    this.client = new DocumentClient(new Uri(EndpointUri), PrimaryKey);
    FeedOptions queryOptions = new FeedOptions { EnableCrossPartitionQuery = true };

    var personQuery = this.client.CreateDocumentQuery<Person>(
        UriFactory.CreateDocumentCollectionUri(DbId, CollectionId), queryOptions)
        .Where(f => f.NameFirst != "Andersen").Take(25).AsDocumentQuery();

    List<Person> retVal = new List<Person>();

    while(personQuery.HasMoreResults)
    {
        var results = await personQuery.ExecuteNextAsync<Person>();
        retVal.AddRange(results);
    }

    return retVal;
}
[HttpGet]
公共异步任务Get()
{
this.client=newdocumentclient(新Uri(EndpointUri),PrimaryKey);
FeedOptions queryOptions=new FeedOptions{EnableCrossPartitionQuery=true};
var personQuery=this.client.CreateDocumentQuery(
CreateDocumentCollectionUri(DbId,CollectionId),queryOptions)
.Where(f=>f.NameFirst!=“Andersen”).Take(25).AsDocumentQuery();
List retVal=新列表();
while(personQuery.HasMoreResults)
{
var results=await personQuery.ExecuteNextAsync();
retVal.AddRange(结果);
}
返回返回;
}

根据您对集合中字符串的索引方式,您可能还需要将
FeedOptions
对象的
EnableScanInQuery
属性设置为
true
以获得所需的顶级文档,如Nick所述,使用LINQ.Take()是正确的方法


使用FeedOptions.MaxItemCount和ExecuteExtAsync也是一种替代方法。但是,正如您所观察到的,它可能会返回0个结果,因此需要将其考虑在内。有关这方面的更多详细信息,请参阅Aravind对这个相关问题的评论:。

如Nick所述,使用LINQ.Take()来获取所需的顶级文档是正确的方法


使用FeedOptions.MaxItemCount和ExecuteExtAsync也是一种替代方法。但是,正如您所观察到的,它可能会返回0个结果,因此需要将其考虑在内。有关这方面的更多详细信息,请参阅Aravind对这一相关问题的评论:。

这似乎不起作用。严重性代码说明项目文件行抑制状态错误CS1503参数1:无法从“Microsoft.Azure.Documents.Client.FeedResponse”转换为“System.Collections.Generic.IEnumerable”CoreWebApp\Documents\visual studio 2017\Project\CoreWebApp\CoreWebApp\Api\PersonControl.cs 44Active@WouldRatherBuildAMotor我添加了映射键入
ExecuteNextAsync
。用最新的答案试一试。这似乎不起作用。严重性代码说明项目文件行抑制状态错误CS1503参数1:无法从“Microsoft.Azure.Documents.Client.FeedResponse”转换为“System.Collections.Generic.IEnumerable”CoreWebApp\Documents\visual studio 2017\Project\CoreWebApp\CoreWebApp\Api\PersonControl.cs 44Active@WouldRatherBuildAMotor我添加了映射键入
ExecuteNextAsync
。用最新的答案试一试。