#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, думая, что это будет то место, где вам нужно предоставить ссылку на таблицу, но я ошибался.