c# - 复合表存储查询
问题描述
以下函数应返回两个日期之间包含特定 PartitionKey 和 TimeStamp 的项目列表
public async Task<List<T>> RetrieveEntityDataAsync<T>(string deviceId = null) where T : TableEntity, new()
{
try
{
TableQuery<T> DataTableQuery = new TableQuery<T>();
if (!string.IsNullOrEmpty(deviceId))
{
var filter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, deviceId);
var filter1 = TableQuery.GenerateFilterCondition("Timestamp", QueryComparisons.GreaterThanOrEqual, DateTime.Now.AddDays(-1).ToUniversalTime().ToString());
var filter2 = TableQuery.GenerateFilterCondition("Timestamp", QueryComparisons.LessThanOrEqual, DateTime.Now.ToUniversalTime().ToString());
var combined = TableQuery.CombineFilters(filter, TableOperators.And,filter1);
var total = TableQuery.CombineFilters(combined, TableOperators.And, filter2);
DataTableQuery = new TableQuery<T>().Where(total);
}
var l = new List<T>();
TableContinuationToken continuationToken = null;
do
{
var queryResponse = await table.ExecuteQuerySegmentedAsync(DataTableQuery, continuationToken);
continuationToken = queryResponse.ContinuationToken;
l.AddRange(queryResponse.Results);
}
while (continuationToken != null);
return l;
}
catch (Exception ExceptionObj)
{
throw ExceptionObj;
}
}
发送它不起作用并通过返回“StorageException:Bad Request”进入异常。我究竟做错了什么?谢谢
解决方案
根据您提供的代码,您希望按日期时间筛选 Azure 表实体。我建议你用TableQuery.GenerateFilterConditionForDate
创造条件。例如
CloudStorageAccount account = CloudStorageAccount.Parse(connectionStr);
var client =account.CreateCloudTableClient(new TableClientConfiguration());
var table =client.GetTableReference("people");
string date1 = TableQuery.GenerateFilterConditionForDate(
"Timestamp", QueryComparisons.GreaterThanOrEqual,
DateTime.Now.AddDays(-1).ToUniversalTime());
string date2 = TableQuery.GenerateFilterConditionForDate(
"Timestamp", QueryComparisons.LessThanOrEqual,
DateTime.Now.ToUniversalTime());
var key = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "Jack");
string filter = TableQuery.CombineFilters(date1, TableOperators.And, date2);
filter = TableQuery.CombineFilters(filter, TableOperators.And, key);
var query = new TableQuery<Person>().Where(filter);
var l = new List<Person>();
TableContinuationToken continuationToken = null;
do
{
var queryResponse = await table.ExecuteQuerySegmentedAsync(query, continuationToken);
continuationToken = queryResponse.ContinuationToken;
l.AddRange(queryResponse.Results);
}
while (continuationToken != null);
foreach (var s in l) {
Console.WriteLine(s.PartitionKey + "" + s.);
}
推荐阅读
- sql - 如何使窗口函数在 Redshift 表上工作
- python - 将 2-D numpy 数组附加到 3-D numpy 数组
- fortran - 当我使用 mpifort 编译时,所有处理器都认为它们是根
- reactjs - 一次触发多个 api 调用
- javascript - 创建键值 javascript 值
- mongodb - Vue如何获取Axios事务的结果从服务器传输到客户端?
- c# - 如何将层次材质中的游戏对象更改为另一种材质?
- python - 饼图matplotlib上标签之间的间距
- c# - 定期从 Web 应用程序调用 api ASP.NET Razor
- javascript - Node.js,哈巴狗。如何设置指向另一个 pug 文件的链接