简体   繁体   English

是否可以从.net核心查询表存储?

[英]Is it possible to query table storage from .net core?

I'm attempting to query table cache using LINQ: 我正在尝试使用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);
}

However, getting this exception: 但是,得到此异常:

'CloudTable' does not contain a definition for 'CreateQuery' and no accessible extension method 'CreateQuery' accepting a first argument of type 'CloudTable' could be found (are you missing a using directive or an assembly reference?) 'CloudTable'不包含'CreateQuery'的定义,找不到可以接受的扩展方法'CreateQuery'接受类型为'CloudTable'的第一个参数(是否缺少using指令或程序集引用?)

What am I doing wrong? 我究竟做错了什么? Is it not possible to query table cache from .net core? 无法从.net核心查询表缓存?

在此处输入图片说明

For some additinal info, here are the create methods available on this class: 对于一些附加信息,以下是此类可用的创建方法:

在此处输入图片说明

Here are all the dependencies: 这是所有依赖项:

在此处输入图片说明

I've removed LINQ from the equation, yet still getting the following issue: 我从等式中删除了LINQ,但仍然遇到以下问题:

在此处输入图片说明

And the full source is below: 完整的源代码如下:

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

Currently .net core doesn't support querying using Linq as far as I know. 据我所知,.net core目前不支持使用Linq进行查询。 But I know You can do it this 但我知道你可以做到这一点

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();

EDIT: GitHub issue 编辑: GitHub问题

EDIT 2: ExecuteQuery extension method 编辑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;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM