Можно ли запросить хранилище таблиц из ядра .net? - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь запросить кеш таблицы, используя LINQ:

public static IEnumerable<DocumentMetaDataEntity> Get(string connectionString, string cacheName, DeconstructedFileName deconstructedFileName, FileMetaDataFilters filters)
{
    var acc = CloudStorageAccount.Parse(connectionString);
    var tableClient = acc.CreateCloudTableClient();
    var table = tableClient.GetTableReference(cacheName);
    var translations = from entity in table.CreateQuery<DocumentMetaDataEntity>()
                       where (entity.sourceParty == sourceParty.ToLowerTrim()
                                   && entity.destinationParty == destinationParty.ToLowerTrim())
                             || (entity.sourceParty == "YES"
                                   && entity.destinationParty == destinationParty.ToLowerTrim())
                       select entity;

    return translations.Where(x => x.expireAt > DateTime.Now)
                       .Where(x => x.effectiveAt < DateTime.Now);
}

Однако, получая это исключение:

«CloudTable» не содержит определения для «CreateQuery»и не удалось найти доступный метод расширения CreateQuery, принимающий первый аргумент типа CloudTable (отсутствует директива using или ссылка на сборку?)

Что я делаю неправильно?Разве нельзя запросить кеш таблиц из ядра .net?

enter image description here

Для некоторой дополнительной информации вот create методов, доступных в этом классе:

enter image description here

Вот все зависимости:

enter image description here

Я удалил LINQ из уравнения, но все еще получаю следующую проблему:

enter image description here

И полный источник приведен ниже:

public static IEnumerable<DocumentMetaDataEntity> Get(string connectionString, string cacheName, DeconstructedFileName deconstructedFileName, FileMetaDataFilters filters)
{
    var acc = CloudStorageAccount.Parse(connectionString);
    var tableClient = acc.CreateCloudTableClient();
    var table = tableClient.GetTableReference(cacheName);
    var query = new TableQuery<DocumentMetaDataEntity>().Where
        (TableQuery.CombineFilters
            (TableQuery.GenerateFilterCondition("FacilityCode", QueryComparisons.Equal, deconstructedFileName.FacilityCode)
               , TableOperators.And
               , TableQuery.GenerateFilterCondition("LastName", QueryComparisons.LessThan, deconstructedFileName.LastName)
            )
        );            

    var entities = table.ExecuteQuery(query).ToList();
}

1 Ответ

0 голосов
/ 24 января 2019

Насколько я знаю, в настоящее время ядро ​​.net не поддерживает запросы с использованием Linq.Но я знаю, что Вы можете сделать это следующим образом:

var table = acc.GetTableReference("TableName");

var partitionKey = "PartitionKey";

TableQuery<TableModel> rangeQuery = new TableQuery<TableModel>()
      .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey.ToString()));

var entities = table.ExecuteQuery(rangeQuery).ToList();

РЕДАКТИРОВАТЬ: GitHub выпуск

РЕДАКТИРОВАТЬ 2: Метод расширения ExecuteQuery

public static IEnumerable<T> ExecuteQuery<T>(this CloudTable table, TableQuery<T> query) where T : ITableEntity, new()
    {
        List<T> result = new List<T>();

        TableContinuationToken continuationToken = null;
        do
        {
            // Retrieve a segment (up to 1,000 entities).
            TableQuerySegment<T> tableQueryResult = table.ExecuteQuerySegmentedAsync(query, continuationToken).Result;

            result.AddRange(tableQueryResult.Results);

            continuationToken = tableQueryResult.ContinuationToken;
        } while (continuationToken != null);

        return result;
    }
...