Есть ли поддержка разбиения по страницам с помощью OData в Cosmos DB?

Я вижу, что есть поддержка смещения / ограничения при доступе к Cosmos DB в Azure через SQL API, но поддерживает ли это OData?


person JᴀʏMᴇᴇ    schedule 27.05.2020    source источник
comment
Почему бы не использовать SDK?   -  person ravi tella    schedule 27.05.2020
comment
@ravitella - спасибо за ответ, какой SDK?   -  person JᴀʏMᴇᴇ    schedule 27.05.2020
comment
Я обновил свой ответ. Возможно, потребуется настроить конкретное использование в вашем проекте, и это поддерживается в проекте веб-API.   -  person Jason Pan    schedule 29.05.2020
comment
Ваша проблема решена? Не знаю, полезен ли вам мой план, жду вашего ответа.   -  person Jason Pan    schedule 01.06.2020


Ответы (1)


ОБНОВЛЕНИЕ

Вы можете загрузить мою демонстрацию на github. И эта статья и официальный документ может вам помочь.

Данные в моей учетной записи хранилища

введите описание изображения здесь

Тест почтальона

введите описание изображения здесь

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;
    }
}

ЧАСТНЫЙ

Я не совсем понимаю это решение. Какое приложение вы будете использовать, настольное или веб-приложение?

Если ваше приложение является веб-приложением, вы можете просмотреть эту статью. (официальный документ, Пейджинг с помощью OData и веб-API ASP.NET)

Если ваше приложение не веб-приложение. Я предлагаю вам использовать linq для решения проблемы.

введите описание изображения здесь

введите описание изображения здесь

    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();
    }
person Jason Pan    schedule 28.05.2020
comment
Спасибо, @Jason! Оцените ответ. Проблема в том, что у меня есть запрос OData, который я хотел бы передать серверу / Cosmos DB. Клиент (библиотека js) генерирует длинный список фильтров и т. Д. Вместе с деталями разбиения на страницы (пропустить / взять). Прямо сейчас, чтобы запросить Cosmos DB, я разбиваю это, чтобы вручную преобразовать его в SQL. Это не лучший подход, поэтому хотелось бы просто передать запрос OData в Cosmos. Я знаю, что могу сделать это с помощью EF, но я не видел, чтобы эта поддержка пропустила дубль. - person JᴀʏMᴇᴇ; 28.05.2020
comment
@ JᴀʏMᴇᴇ Если у вас есть время, вы можете загрузить образец в веб-интерфейсе, который я предоставил для просмотра, который поддерживает пропуск. Я просто попробовал смоделированные данные, но запрос данных в Cosmos - это нормально. Ошибка 406, сначала вы попробуете, и я свяжусь с вами. - person Jason Pan; 28.05.2020