gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:49:40 25 4
gpt4 key购买 nike

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

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

接下来我使用这个过滤器创建一个查询:

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

接下来我执行查询:

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

但是,由于某种原因,结果 始终包含零 (0) 次命中。

如果我在没有任何过滤器的情况下执行查询...

var query = new TableQuery<ResponseEntity>();

...我确实得到了所有实体。

查看生成的过滤器字符串,它对我来说看起来不错(并且与使用 Cosmos 查询构建器时 Azure 门户中的相同):

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

根据Timestamp查询是否有限制?

编辑:尝试切换到新的 Microsoft.Azure.Cosmos.Table NuGet 包(目前处于预览状态,版本 0.9.1) ,但在按 Timestamp 过滤时我仍然没有得到任何结果。

最佳答案

请引用我的工作代码。

代码:

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

}
}

我的数据列表如下,没有过滤:

enter image description here

如果我使用 Timestamp 作为过滤器,它会起作用:

enter image description here

我想提的另一件事是,请尽可能避免 timestamp 间隔查询。这样的查询将导致在服务器端进行全表扫描。如果您的场景通常需要timestamp间隔查询,请考虑选择timestamp作为分区键或行键以优化查询性能。


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

关于.net-core - 无法使用表 API 在 CosmosDB 中按时间戳查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52839020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com