Ошибка при создании запроса LINQ для хранилища таблиц Azure

#linq #.net-core #azure-table-storage

Вопрос:

Я получаю доступ к хранилищу таблиц из консольного приложения .NET CORE 3.1

Я использую последнюю (на данный момент) версию PM

microsoft.azure.космос.таблица1.0.8

который, в свою очередь, использует

Майкрософт.Лазурь.DocumentDB.Core2.11.2

Многие операции над таблицей работают нормально, но я столкнулся с ошибкой при создании запроса LINQ

Это строка, генерирующая ошибку, исключение нулевой ссылки

      var myquery = new TableQuery<DocEntity>()
        .Where(r => r.PartitionKey == "doc_manager_test_client");
 

и это обходной путь, который решает проблему и позволяет мне выполнить запрос

Но мне не нравится этот синтаксис, уродливый и многословный, делающий длинные запросы нечитабельными

      var myquery = new TableQuery<DocEntity>()
        .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "doc_manager_test_client"));
 

Я не думаю , что проблема заключается в доцент, во всяком случае, это класс

   public class DocEntity : TableEntity {
     public DocEntity() {
     }

     public DocEntity(string doc_manager_id, string doc_id) {
        PartitionKey = doc_manager_id;
        RowKey = doc_id;
     }

     public string DocName { get; set; }
     public string DocCategory { get; set; }
     public Int64 DocSize { get; set; }
  }
 

Кто-нибудь может помочь мне решить эту проблему?

Официальный документ плохой, я не нашел ни одного полного примера, который показывал бы, как выполнять запрос LINQ, есть только фрагмент, подобный моему выше, который не работает в моем приложении. Возможно, это проблема с управлением версиями, они использовали предыдущие версии .NET, но я хочу, чтобы он работал с ядром 3.1

Большое спасибо

Ответ №1:

Мне удалось воспроизвести эту проблему. Проблема возникает из Provider -за того, что свойство of TableQuery равно нулю (не знаю почему).

Вот обходной путь, который вы можете использовать:

         StorageCredentials credentials = new StorageCredentials("<account-name>", "<account-key>");
        CloudTable table = new CloudTable(new Uri("https://<account-name>.table.core.windows.net/<table-name>"),
            credentials);
        var tableQuery = table.CreateQuery<DocEntity>().Where(r => r.PartitionKey == "somevalue");
 

и вы не должны получить ошибку.

Комментарии:

1. Спасибо, я думаю, что запрос должен знать, на какую таблицу ссылаются (не только на сущность), даже на этапе создания, и он получает эту информацию, когда вы вызываете метод createquery таблицы. Я использовал метод таблицы с помощью executequery, думая, что это будет то место, где вам нужно предоставить ссылку на таблицу, но я ошибался.