在azure表存储的web api响应中排除partitionkey和rowkey

时间:2016-10-31 14:27:03

标签: azure asp.net-web-api2 azure-storage azure-table-storage

我在网上搜索,但没有找到任何解决方案。请帮助我解决这个问题。

问题:我有一个带有azure表存储的webapi,当我查询azure表时,包含partitionkey和rowkey的webapi json响应。 我希望使用azure table的partitionkey和rowkey排除我的web api响应。

当前输出: {"分区键":"测试"," Rowkey":" abc&# 34; ,"名称":"用户""电子邮件":" test@test.com",&#34结构域":" QWE"}

预期输出 {"名称":"用户""电子邮件":" test@test.com","结构域&#34 ;: " QWE"}

3 个答案:

答案 0 :(得分:1)

  

当我查询azure表时,webapi json响应包含在partitionkey和rowkey中。我希望我的web api响应排除在azure表的partitionkey和rowkey之外。

您可以尝试使用查询投影从实体中返回一组有限的属性,同时从Azure表存储中选择实体。以下查询供您参考。

TableQuery<EmployeeEntity> EmpQuery = table.CreateQuery<EmployeeEntity>();
var query = (from ep in EmpQuery
             where ep.PartitionKey == "pkvalue" && ep.RowKey== "rkvalue"
             select new { Fname = ep.FirstName, Lname = ep.LastName}).AsTableQuery();
var emps = query.Execute();

答案 1 :(得分:1)

您可以使用SelectColumns类中的属性TableQuery来指定要从Azure存储表服务中查询的列。

答案 2 :(得分:0)

从结果中排除PartitionKey和RowKey的关键是将TableRequestOptions的 ProjectSystemProperties 设置为 false

所以上面的代码应该像这样修改:

var emps = query.Execute(new TableRequestOptions { ProjectSystemProperties = false });

另一个工作示例:

var query = new TableQuery<Event>()
    .Where(
        TableQuery.GenerateFilterCondition(
            "PartitionKey", QueryComparisons.Equal, partitionKey))
    .Select(new[] { "Id" });

var results = table.ExecuteQuery(query, 
    new TableRequestOptions { ProjectSystemProperties = false });

然后你会得到这样的回应:

{"odata.etag":"W/\"datetime'2017-10-27T08%3A05%3A40.6551979Z'\"","Id":"Event-1" },
{"odata.etag":"W/\"datetime'2017-10-27T09%3A05%3A40.6551979Z'\"","Id":"Event-2" },
...

要避免在结果中使用odata.etag,请在TableRequestOptions中指定PayloadFormat并获得您想要的内容:

var results = table.ExecuteQuery(query, 
    new TableRequestOptions { 
        ProjectSystemProperties = false, 
        PayloadFormat = TablePayloadFormat.JsonNoMetadata 
});

结果:

{ "Id":"Event-1" },{ "Id":"Event-2" },...