Search code examples
c#azureodataazure-cosmosdbazure-cosmosdb-sqlapi

Is there support for paging with OData in Cosmos DB?


I can see there is support for offset/limit when accessing a Cosmos DB in Azure via the SQL API - but does OData support this yet?


Solution

  • UPDATE

    You can download my demo in github. And this article and offical document can help u.

    Data in My Storage account

    enter image description here

    Test by postman

    enter image description here

    TestDataController.cs

    public class TestDataController : ODataController
    {
        [EnableQuery]
        public IHttpActionResult Get()
        {
            CloudStorageAccount account = CloudStorageAccount.Parse("DefaultEndpointsProtocol=***x=core.windows.net");
            CloudTableClient tableClient = account.CreateCloudTableClient();
            //table name
            CloudTable table = tableClient.GetTableReference("test");
            // all datas in table
            IQueryable<CustomerEntity> linqQuery = table.CreateQuery<CustomerEntity>().Where(x => x.PartitionKey != "0")
            .Select(x => new CustomerEntity() { PartitionKey = x.PartitionKey, RowKey = x.RowKey, Name = x.Name, Role = x.Role });
            // test data
            //var result = CreateTestData().AsQueryable();
            // real data in `test` table
            var a = linqQuery.ToList<CustomerEntity>().AsQueryable();
            return Ok(a);
        }
    
        public List<TestData> CreateTestData()
        {
            List<TestData> data = new List<TestData>();
            data.Add(new TestData { Id = 1, Name = "Jignesh", Role = "Project Manager" });
            data.Add(new TestData { Id = 2, Name = "Tejas", Role = "Architect" });
            data.Add(new TestData { Id = 3, Name = "Rakesh", Role = "Lead" });
    
            return data;
        }
    }
    

    WebApiConfig.cs

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.MapODataServiceRoute("odata", null, GetEdmModel(), new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));
            config.EnsureInitialized();
           
    
        }
        private static IEdmModel GetEdmModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.Namespace = "WebAPITest";
            builder.ContainerName = "DefaultContainer";
            builder.EntitySet<TestData>("TestData");
            // you can dynamic load entitys later
            builder.EntitySet<CustomerEntity>("CustomerEntity");
            var edmModel = builder.GetEdmModel();
            return edmModel;
        }
    }
    

    PRIVIOUS

    I am not clear about this solution. What application will you use, desktop or web application?

    If your app is web application, you can see these article.(offical document , Paging With OData And ASP.NET Web API )

    If your app not web application. I suggest u use linq to solve the issue.

    enter image description here

    enter image description here

        public static async Task Main(string[] args)
        {
            Console.WriteLine("Azure Cosmos Table Samples");
            CloudStorageAccount account = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=*****fix=core.windows.net");
            CloudTableClient tableClient = account.CreateCloudTableClient();
            CloudTable table = tableClient.GetTableReference("test");
            IQueryable<CustomerEntity> linqQuery = table.CreateQuery<CustomerEntity>().Where(x => x.PartitionKey != "0")
            .Select(x => new CustomerEntity() { PartitionKey = x.PartitionKey, RowKey = x.RowKey, Name = x.Name });
           // skip and take method 
           var c = linqQuery.ToList<CustomerEntity>().Skip(3).Take(1).ToList<CustomerEntity>();
            Console.Read();
        }