在 Azure Functions 中查询外部 table
Query external table in Azure Functions
我创建了一个 Azure 函数 (C#) 来从本地 SQL 服务器数据 table 中提取数据。我使用了实验性的外部 Table 连接器(apiHubTable 作为技术名称)。
连接器从我的 On-Premise table 检索数据,但未执行查询(我始终拥有 table 的完整内容):
Query query = Query.Parse($"LastUpdate >\"{jobDefinition.LastExecutionDate.ToString("yyyy-MM-ddTHH:mm:ss")}\"");
var result = await eventsSqlTable.ListEntitiesAsync(query);
这是实体定义:
public class Event
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime LastUpdate { get; set; }
}
用什么语言来表达查询?数据?另一个 ?你有样品吗?
此功能是否已实现?
过滤器以 OData "language" (OData website) 表示,因为与 On Premise SQL 服务器的连接与逻辑应用程序抛出相同的数据网关(过滤器是在 SQL 连接器的逻辑应用程序中用 OData 表示。
这是一个查询示例:
$top=1000&$orderby=LastUpdate&$filter=year(LastUpdate) gt 2016 or (year(LastUpdate) eq 2016 and month(LastUpdate) gt 11 or (month(LastUpdate) eq 11 and day(LastUpdate) gt 3 or (day(LastUpdate) eq 3 and hour(LastUpdate) gt 11 or (hour(LastUpdate) eq 11 and minute(LastUpdate) gt 15 or (minute(LastUpdate) eq 15 and second(LastUpdate) ge 2)))))
注意: 日期比较非常复杂,因为 OData/数据网关将日期时间转换为 datetimeoffset(T-SQL 类型)。如果您的 table 字段是日期时间类型,则可能会出现一些问题。
此 pragamtica website 拥有一个可以帮助您使用图形工具构建请求的工具。
最后,这里是用于构建过滤器最后一部分的代码:
public static string BuildDateFilter(string fieldName, DateTime dateToCompare)
{
StringBuilder filterbuilder = new StringBuilder();
filterbuilder.Append($"year({fieldName}) gt {dateToCompare.Year} or ("); // Or Year
filterbuilder.Append($"year({fieldName}) eq {dateToCompare.Year} and ("); //And Year
filterbuilder.Append($"month({fieldName}) gt {dateToCompare.Month} or ("); //Or Month
filterbuilder.Append($"month({fieldName}) eq {dateToCompare.Month} and ("); //And Month
filterbuilder.Append($"day({fieldName}) gt {dateToCompare.Day} or ("); //Or Day
filterbuilder.Append($"day({fieldName}) eq {dateToCompare.Day} and ("); //And Day
filterbuilder.Append($"hour({fieldName}) gt {dateToCompare.Hour} or ("); //Or Hour
filterbuilder.Append($"hour({fieldName}) eq {dateToCompare.Hour} and ("); //And Hour
filterbuilder.Append($"minute({fieldName}) gt {dateToCompare.Minute} or ("); //Or Minute
filterbuilder.Append($"minute({fieldName}) eq {dateToCompare.Minute} and ("); //And Minute
filterbuilder.Append($"second({fieldName}) ge {dateToCompare.Second}");
filterbuilder.Append(")"); //And Minute
filterbuilder.Append(")"); //Or Minute
filterbuilder.Append(")"); //And Hour
filterbuilder.Append(")"); //Or Hour
filterbuilder.Append(")"); //And Day
filterbuilder.Append(")"); //Or Day
filterbuilder.Append(")"); //And Month
filterbuilder.Append(")"); //Or Month
filterbuilder.Append(")"); //And Year
filterbuilder.Append(")"); //Or Year
return filterbuilder.ToString();
}
我创建了一个 Azure 函数 (C#) 来从本地 SQL 服务器数据 table 中提取数据。我使用了实验性的外部 Table 连接器(apiHubTable 作为技术名称)。
连接器从我的 On-Premise table 检索数据,但未执行查询(我始终拥有 table 的完整内容):
Query query = Query.Parse($"LastUpdate >\"{jobDefinition.LastExecutionDate.ToString("yyyy-MM-ddTHH:mm:ss")}\"");
var result = await eventsSqlTable.ListEntitiesAsync(query);
这是实体定义:
public class Event
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime LastUpdate { get; set; }
}
用什么语言来表达查询?数据?另一个 ?你有样品吗? 此功能是否已实现?
过滤器以 OData "language" (OData website) 表示,因为与 On Premise SQL 服务器的连接与逻辑应用程序抛出相同的数据网关(过滤器是在 SQL 连接器的逻辑应用程序中用 OData 表示。
这是一个查询示例:
$top=1000&$orderby=LastUpdate&$filter=year(LastUpdate) gt 2016 or (year(LastUpdate) eq 2016 and month(LastUpdate) gt 11 or (month(LastUpdate) eq 11 and day(LastUpdate) gt 3 or (day(LastUpdate) eq 3 and hour(LastUpdate) gt 11 or (hour(LastUpdate) eq 11 and minute(LastUpdate) gt 15 or (minute(LastUpdate) eq 15 and second(LastUpdate) ge 2)))))
注意: 日期比较非常复杂,因为 OData/数据网关将日期时间转换为 datetimeoffset(T-SQL 类型)。如果您的 table 字段是日期时间类型,则可能会出现一些问题。
此 pragamtica website 拥有一个可以帮助您使用图形工具构建请求的工具。
最后,这里是用于构建过滤器最后一部分的代码:
public static string BuildDateFilter(string fieldName, DateTime dateToCompare)
{
StringBuilder filterbuilder = new StringBuilder();
filterbuilder.Append($"year({fieldName}) gt {dateToCompare.Year} or ("); // Or Year
filterbuilder.Append($"year({fieldName}) eq {dateToCompare.Year} and ("); //And Year
filterbuilder.Append($"month({fieldName}) gt {dateToCompare.Month} or ("); //Or Month
filterbuilder.Append($"month({fieldName}) eq {dateToCompare.Month} and ("); //And Month
filterbuilder.Append($"day({fieldName}) gt {dateToCompare.Day} or ("); //Or Day
filterbuilder.Append($"day({fieldName}) eq {dateToCompare.Day} and ("); //And Day
filterbuilder.Append($"hour({fieldName}) gt {dateToCompare.Hour} or ("); //Or Hour
filterbuilder.Append($"hour({fieldName}) eq {dateToCompare.Hour} and ("); //And Hour
filterbuilder.Append($"minute({fieldName}) gt {dateToCompare.Minute} or ("); //Or Minute
filterbuilder.Append($"minute({fieldName}) eq {dateToCompare.Minute} and ("); //And Minute
filterbuilder.Append($"second({fieldName}) ge {dateToCompare.Second}");
filterbuilder.Append(")"); //And Minute
filterbuilder.Append(")"); //Or Minute
filterbuilder.Append(")"); //And Hour
filterbuilder.Append(")"); //Or Hour
filterbuilder.Append(")"); //And Day
filterbuilder.Append(")"); //Or Day
filterbuilder.Append(")"); //And Month
filterbuilder.Append(")"); //Or Month
filterbuilder.Append(")"); //And Year
filterbuilder.Append(")"); //Or Year
return filterbuilder.ToString();
}