Azure Table storage input bindings for Azure Functions
Use the Azure Table storage input binding to read a table in an Azure Storage account.
Example
One entity
The following example shows a C# function that reads a single table row. For every message sent to the queue, the function will be triggered.
The row key value "{queueTrigger}" indicates that the row key comes from the queue message string.
public class TableStorage
{
public class MyPoco
{
public string PartitionKey { get; set; }
public string RowKey { get; set; }
public string Text { get; set; }
}
[FunctionName("TableInput")]
public static void TableInput(
[QueueTrigger("table-items")] string input,
[Table("MyTable", "MyPartition", "{queueTrigger}")] MyPoco poco,
ILogger log)
{
log.LogInformation($"PK={poco.PartitionKey}, RK={poco.RowKey}, Text={poco.Text}");
}
}
CloudTable
CloudTable
is only supported in the Functions v2 and and higher runtimes.
Use a CloudTable
method parameter to read the table by using the Azure Storage SDK. Here's an example of a function that queries an Azure Functions log table:
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.Cosmos.Table;
using System;
using System.Threading.Tasks;
namespace FunctionAppCloudTable2
{
public class LogEntity : TableEntity
{
public string OriginalName { get; set; }
}
public static class CloudTableDemo
{
[FunctionName("CloudTableDemo")]
public static async Task Run(
[TimerTrigger("0 */1 * * * *")] TimerInfo myTimer,
[Table("AzureWebJobsHostLogscommon")] CloudTable cloudTable,
ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
TableQuery<LogEntity> rangeQuery = new TableQuery<LogEntity>().Where(
TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal,
"FD2"),
TableOperators.And,
TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThan,
"t")));
// Execute the query and loop through the results
foreach (LogEntity entity in
await cloudTable.ExecuteQuerySegmentedAsync(rangeQuery, null))
{
log.LogInformation(
$"{entity.PartitionKey}\t{entity.RowKey}\t{entity.Timestamp}\t{entity.OriginalName}");
}
}
}
}
For more information about how to use CloudTable, see Get started with Azure Table storage.
If you try to bind to CloudTable
and get an error message, make sure that you have a reference to the correct Storage SDK version.
IQueryable
IQueryable
is only supported in the Functions v1 runtime.
The following example shows a C# function that reads multiple table rows where the MyPoco
class derives from TableEntity
.
public class TableStorage
{
public class MyPoco : TableEntity
{
public string Text { get; set; }
}
[FunctionName("TableInput")]
public static void TableInput(
[QueueTrigger("table-items")] string input,
[Table("MyTable", "MyPartition")] IQueryable<MyPoco> pocos,
ILogger log)
{
foreach (MyPoco poco in pocos)
{
log.LogInformation($"PK={poco.PartitionKey}, RK={poco.RowKey}, Text={poco.Text}");
}
}
}
Attributes and annotations
In C# class libraries, use the following attributes to configure a table input binding:
-
The attribute's constructor takes the table name, partition key, and row key. The attribute can be used on an
out
parameter or on the return value of the function, as shown in the following example:[FunctionName("TableInput")] public static void Run( [QueueTrigger("table-items")] string input, [Table("MyTable", "Http", "{queueTrigger}")] MyPoco poco, ILogger log) { ... }
You can set the
Connection
property to specify the storage account to use, as shown in the following example:[FunctionName("TableInput")] public static void Run( [QueueTrigger("table-items")] string input, [Table("MyTable", "Http", "{queueTrigger}", Connection = "StorageConnectionAppSetting")] MyPoco poco, ILogger log) { ... }
For a complete example, see the C# example.
-
Provides another way to specify the storage account to use. The constructor takes the name of an app setting that contains a storage connection string. The attribute can be applied at the parameter, method, or class level. The following example shows class level and method level:
[StorageAccount("ClassLevelStorageAppSetting")] public static class AzureFunctions { [FunctionName("TableInput")] [StorageAccount("FunctionLevelStorageAppSetting")] public static void Run( //... { ... }
The storage account to use is determined in the following order:
- The
Table
attribute'sConnection
property. - The
StorageAccount
attribute applied to the same parameter as theTable
attribute. - The
StorageAccount
attribute applied to the function. - The
StorageAccount
attribute applied to the class. - The default storage account for the function app ("AzureWebJobsStorage" app setting).
Configuration
The following table explains the binding configuration properties that you set in the function.json file and the Table
attribute.
function.json property | Attribute property | Description |
---|---|---|
type | n/a | Must be set to table . This property is set automatically when you create the binding in the Azure portal. |
direction | n/a | Must be set to in . This property is set automatically when you create the binding in the Azure portal. |
name | n/a | The name of the variable that represents the table or entity in function code. |
tableName | TableName | The name of the table. |
partitionKey | PartitionKey | Optional. The partition key of the table entity to read. See the usage section for guidance on how to use this property. |
rowKey | RowKey | Optional. The row key of the table entity to read. See the usage section for guidance on how to use this property. |
take | Take | Optional. The maximum number of entities to read in JavaScript. See the usage section for guidance on how to use this property. |
filter | Filter | Optional. An OData filter expression for table input in JavaScript. See the usage section for guidance on how to use this property. |
connection | Connection | The name of an app setting that contains the Storage connection string to use for this binding. The setting can be the name of an "AzureWebJobs" prefixed app setting or connection string name. For example, if your setting name is "AzureWebJobsMyStorage", you can specify "MyStorage" here. The Functions runtime will automatically look for an app setting that named "AzureWebJobsMyStorage". If you leave connection empty, the Functions runtime uses the default Storage connection string in the app setting that is named AzureWebJobsStorage . |
When you're developing locally, app settings go into the local.settings.json file.
Usage
Read one row in
Set
partitionKey
androwKey
. Access the table data by using a method parameterT <paramName>
. In C# script,paramName
is the value specified in thename
property of function.json.T
is typically a type that implementsITableEntity
or derives fromTableEntity
. Thefilter
andtake
properties are not used in this scenario.Read one or more rows
Access the table data by using a method parameter
IQueryable<T> <paramName>
. In C# script,paramName
is the value specified in thename
property of function.json.T
must be a type that implementsITableEntity
or derives fromTableEntity
. You can useIQueryable
methods to do any filtering required. ThepartitionKey
,rowKey
,filter
, andtake
properties are not used in this scenario.Note
IQueryable
isn't supported in the Functions v2 runtime. An alternative is to use a CloudTable paramName method parameter to read the table by using the Azure Storage SDK. If you try to bind toCloudTable
and get an error message, make sure that you have a reference to the correct Storage SDK version.