让我们先报价:
实体中所有属性的组合大小不能超过1MB.(来自msdn的ROW/Entity)
我的问题是:由于所有内容都是XML数据,因此对于1MB,是1MB的内容,1MB的ASCII字符,或1MB的UTF8字符,还是别的什么?
样品:
Row1: PartitionKey="A', RowKey="A", Data="A"
Row2: PartitionKey="A', RowKey="A", Data="?" (this is a UTF8 unicode A)
Run Code Online (Sandbox Code Playgroud)
Row1和Row2的大小(长度)是一样的,还是Row2.Length=Row1.Length+1?
我编写简单的WorkerRole,将测试数据添加到表中.插入代码是这样的.
var TableClient = this.StorageAccount.CreateCloudTableClient();
TableClient.CreateTableIfNotExist(TableName);
var Context = TableClient.GetDataServiceContext();
this.Context.AddObject(TableName, obj);
this.Context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
此代码针对每个客户端请求运行.我用1-30个客户端线程进行测试.我有很多不同大小的实例.我不知道我做错了什么,但我无法达到每秒10次插入.如果有人知道如何提高速度请告诉我.谢谢
UPDATE
以下方法可用于将实体集合批量插入为单个事务:
CloudTable.ExecuteBatch(TableBatchOperation batch)
Run Code Online (Sandbox Code Playgroud)
如果在插入期间任何实体失败,则不会从集合中插入任何内容.这仅在插入一个分区时可用.
是否可以跨多个分区执行此类操作?
这可能与此问题有些相关如何在Azure中执行区分大小写的LINQ查询?.但是,我正在使用Storage Client 3.0,而不是linq查询和该问题中的TableStorageContext.
我有一个名为Account的表存储实体,它具有电子邮件地址的字符串属性.email属性不是分区键或行键.
我想以不区分大小写的方式搜索具有匹配电子邮件地址的实体,以便搜索"bob@test.com"返回"Bob@Test.com"等.
我的代码看起来像这样:
TableQuery<Account> rangeQuery = new TableQuery<Account>().Where(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "account"),
TableOperators.And,
TableQuery.GenerateFilterCondition("Email", QueryComparisons.Equal, email)));
var results = accountsTable.ExecuteQuery(rangeQuery).ToList();
Run Code Online (Sandbox Code Playgroud)
有没有办法使用tableQuery类执行不区分大小写的查询,还是有另一种方法?我应该专注于数据整理并确保所有数据都被强制为一致的情况吗?
Azure存储表都具有时间戳列.根据此处的文档,列出的从存储表中删除的方法是选择一个实体然后将其删除.
有没有人知道如何使用代码基于时间戳值的日期时间比较从存储表中删除任何实体?
编辑:
基于给出的建议,我写了以下代码.但是,它会在我的table.ExecuteQuery(rangeQuery)调用上抛出Bad Request异常.有什么建议?
StorageCredentials creds = new StorageCredentials(logAccountName, logAccountKey);
CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);
CloudTableClient client = account.CreateCloudTableClient();
CloudTable table = client.GetTableReference(LogTable);
TableQuery<CloudQuerySummary> rangeQuery = new TableQuery<CloudQuerySummary>()
.Where(TableQuery.GenerateFilterCondition("Timestamp", QueryComparisons.LessThan
, DateTime.Now.AddHours(- DateTime.Now.Hour).ToString()));
TableOperation deleteOperation;
// Loop through the results, displaying information about the entity.
foreach (CloudQuerySummary entity in table.ExecuteQuery(rangeQuery))
{
deleteOperation = TableOperation.Delete(entity);
table.Execute(deleteOperation);
}
Run Code Online (Sandbox Code Playgroud)
编辑2
以下是选择复制/引用它的任何人的最终工作代码.
public void DeleteLogsNotFromToday()
{
StorageCredentials creds = new StorageCredentials(logAccountName, logAccountKey);
CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true); …Run Code Online (Sandbox Code Playgroud) 我真的陷入了对Azure表存储的查询过滤器.我可以知道如何查询时间戳吗?当我单独查询分区键1005时,我得到了我不想要的完整表.当我添加带有时间戳的"和"条件时(尝试了很多格式,但它没有返回任何内容.下面的代码片段:
var lowerlimit = DateTime.Today.AddDays(-52).ToString("yyyy-MM-dd");
string dateRangeFilter = TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "1005"),
TableOperators.And,
TableQuery.GenerateFilterCondition("TimeStamp", QueryComparisons.GreaterThanOrEqual, lowerlimit));
Run Code Online (Sandbox Code Playgroud) 我正在开发一个ASP.Net MVC和WebApi站点,该站点在Windows 8上的Visual Studio 2015中使用表存储.它在开发环境中工作正常(当我UseDevelopmentStorage=true在web.config中设置时).我试图点击" http:// localhost:80 "我必须使用这个并且不能使用另一个端口,有我发布到我的网站的另一个程序,它只会发布到该位置.
我最近运行该站点并在我的代码到达以下代码行时出现以下错误: CloudTable table = cloudTableClient.GetTableReference(tableName);
错误:
无法建立连接,因为目标计算机主动拒绝它127.0.0.1:10002
我尝试过以下方法:
1)Uninstall-Package WindowsAzure.Storage -Version 6.1.0并从NuGet重新安装它
2)重新启动Windows
3)在这里浏览过的C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.7\bin和ran cspack.ext(我看不到任何东西,这似乎涉及到存储)
它还没有运行.关于我可以尝试的任何想法?
更新:
收到上面的错误后,我打开了Cloud Explorer窗口,可以看到我在dev中使用我的代码在本地创建的表(假设这意味着我的本地存储模拟器正在运行),但我仍然遇到错误.然后我关上窗户再打开它.它在扩展"存储帐户(经典)"时稍微旋转,但最终显示了我创建的表格.
奇怪的是,"云资源管理器"窗口中唯一的节点是"存储帐户(经典)",我确信之前有其他节点的列表(即WebApps等).如果有人可以帮忙解决这个问题,请你可以逐步说明该做什么(不是"模拟器没有运行").这是新的,所以寻找简单的指示,我的理解.
非常感激.
我试图基于Azure功能更新Azure表中的行.我看到Table绑定可以处理一个ICollector,它有一个Add方法,它会添加一行.我还看到你使用IQueryable来读取数据.
您如何更新数据中的特定行?
我在WebJobs中看到了与InsertOrReplace相关的东西,它是TableOperations的一种方法,但我不知道它是否或如何发挥作用以及如何在Azure Functions中使用它.
我已经看到有关如何获取Azure存储表的总行数的各种问题,但我想知道如何获取单个分区中的行数.
我怎样才能做到这一点的同时加载最小实体数据量到内存?
我正在尝试处理在添加新属性之前插入Azure表存储的记录.在LINQ的支持是有限的,我努力得到这个工作.
如何使用LINQ(或其他方法)过滤Azure表以仅记录缺少给定实体的属性?
我在Azure函数中编写它,并且在尝试字段的默认值时,此处的行计数返回0.
#r "Microsoft.WindowsAzure.Storage"
using System.Net;
using Microsoft.WindowsAzure.Storage.Table;
public static HttpResponseMessage Run(HttpRequestMessage req, IQueryable<ts_webhit> inTable, TraceWriter log)
{
IEnumerable<ts_webhit> recs = (from r in inTable
where "2016-11-21 12:45" == r.PartitionKey
&& "" == r.Category //The filter I need to run
select r);
log.Info($"{recs.Count()}");
return req.CreateResponse(HttpStatusCode.OK, recs.ToList());
}
public class ts_webhit : TableEntity
{
public string Category { get; set; } = ""; //Attempting a default value
}
Run Code Online (Sandbox Code Playgroud)
r.Category is nothing 生成编译错误String.IsNullOrEmpty(r.Category) 返回它不受支持r.Category == …