.net core 无法使用表API在CosmosDB中按时间戳查询

.net core 无法使用表API在CosmosDB中按时间戳查询,.net-core,azure-storage,azure-cosmosdb,.net Core,Azure Storage,Azure Cosmosdb,我正在创建一个查询,以包含过去30天中的Cosmos实体: var filter = TableQuery.GenerateFilterConditionForDate( "Timestamp", QueryComparisons.GreaterThanOrEqual, DateTimeOffset.Now.Date.AddDays(-30)); 接下来,我将使用此筛选器创建一个查询: var q

我正在创建一个查询,以包含过去30天中的Cosmos实体:

var filter = TableQuery.GenerateFilterConditionForDate(
                "Timestamp", 
                QueryComparisons.GreaterThanOrEqual,
                DateTimeOffset.Now.Date.AddDays(-30));
接下来,我将使用此筛选器创建一个查询:

var query = new TableQuery<ResponseEntity>().Where(filter);
但是,由于某种原因,
结果始终包含零(0)次点击

如果我在没有任何筛选器的情况下执行查询

var query = new TableQuery<ResponseEntity>();
var query=new TableQuery();
…我确实得到了所有的实体

查看生成的筛选器字符串,我认为它是正常的(并且与使用查询生成器for Cosmos时Azure门户中的相同):

时间戳ge datetime'2018-09-15T22:00:00.0000000 Z'

基于
时间戳
的查询是否有任何限制


编辑:尝试切换到新的
Microsoft.Azure.Cosmos.Table
NuGet软件包(当前处于预览中,版本0.9.1),但按
时间戳进行筛选时,我仍然没有得到任何结果。请参考我的工作代码

代码:

使用Microsoft.Azure.CosmosDB.Table;
使用Microsoft.Azure.Storage;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间JayGongCosmosTable
{
班级计划
{
静态void Main(字符串[]参数)
{
TableQuerySegment Result=QueryTableAsync(“测试”).Result;
foreach(结果中的响应)
{                    
Console.WriteLine(“时间戳:+re.Timestamp”);
Console.WriteLine(“------------------------------------------------”);
}
控制台写入线(“执行完成”);
Console.ReadLine();
}
公共静态异步任务QueryTableAsync(字符串表名)
{
CloudStorageAccount-storageAccount=CreateStorageAccountFromConnectionString(“***”);
CloudTableClient tableClient=storageAccount.CreateCloudTableClient();
CloudTable=tableClient.GetTableReference(tableName);
var filter=TableQuery.GenerateFilterConditionForDate(
“时间戳”,
查询比较。大于或等于,
//QueryComparisons.lessthanRequire,
DateTimeOffset.Now.AddDays(-10.Date);
控制台写入线(过滤器);
var query=new TableQuery()。其中(过滤器);
var result=wait table.ExecuteQuerySegmentedAsync(查询,null);
返回结果;
}
}
类响应性:TableEntity
{    
公共字符串名称{get;set;}
公共DateTimeOffset日志时间{get;set;}
}
}
我的数据列表如下,不带过滤器:

如果我使用时间戳作为过滤器,它可以工作:

另一件我想提及的事情是,如果可能,请避免
时间戳
间隔查询。这样的查询将导致服务器端的整个表扫描。如果在您的场景中通常需要“代码>时间戳< /代码>间隔查询,请考虑选择<代码>时间戳<代码>作为分区键或行键来优化查询性能。



最后,总结一下,解决方案是
卸载WindowsAzure.Storage
并使用语句切换以使用
Microsoft.Azure.CosmosDB.Table
中的类型。

您好,我的答案对您有帮助吗?@JayGong我还没有机会尝试,但我无法立即看到任何重大差异?您是否也以.NETCore为目标?您正在使用哪些版本的Azure storage NuGet软件包?Ted,没关系,正在等待您的测试。我的示例代码刚刚在.net控制台测试应用程序中运行,我安装的nuget软件包是Microsoft.Azure.Storage.Common 9.0.0.1-preview和Microsoft.Azure.CosmosDB.Table 2.0.0。这与我所做的几乎相同,而且不起作用。我正在使用
Microsoft.Azure.DocumentDB.Core
2.1.3和
WindowsAzure.Storage
9.3.2.@TedNyberg否,否,请使用
Microsoft.Azure.CosmosDB.Table
。我以前使用过
WindowsAzure.Storage
,但失败,成功使用
Microsoft.Azure.CosmosDB.Table
Microsoft.Azure.CosmosDB.Table
包似乎不适用于.NET Core:/还尝试了Microsoft.Azure.Cosmos.Table
包的预览,但也没有成功。@TedNyberg耶!我已经在回答中总结了解决方案。
var query = new TableQuery<ResponseEntity>();
using Microsoft.Azure.CosmosDB.Table;
using Microsoft.Azure.Storage;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JayGongCosmosTable
{
    class Program
    {
        static void Main(string[] args)
        {
            TableQuerySegment <ResponseEntity>  resultE=  QueryTableAsync("test").Result;
            foreach(ResponseEntity re in resultE)
            {                    
                Console.WriteLine("Timestamp:   "+re.Timestamp);
                Console.WriteLine("------------------------------------------");
            }
            Console.WriteLine("execute done");
            Console.ReadLine();
        }

        public static async Task<TableQuerySegment<ResponseEntity>> QueryTableAsync(string tableName)
        {
            CloudStorageAccount storageAccount = CreateStorageAccountFromConnectionString("***");
            CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
            CloudTable table = tableClient.GetTableReference(tableName);

            var filter = TableQuery.GenerateFilterConditionForDate(
                "Timestamp",
                QueryComparisons.GreaterThanOrEqual,
                //QueryComparisons.LessThanOrEqual,
                DateTimeOffset.Now.AddDays(-10).Date);

            Console.WriteLine(filter);

            var query = new TableQuery<ResponseEntity>().Where(filter);

            var result = await table.ExecuteQuerySegmentedAsync(query, null);

            return result;

        }
    }


    class ResponseEntity : TableEntity
    {    
        public string Name { get; set; }

        public DateTimeOffset logtime { get; set; }

    }
}