在Azure Functions中查询外部表

时间:2017-02-15 13:49:12

标签: c# azure azure-functions

我创建了一个Azure函数(C#)来从内部部署SQL Server数据表中提取数据。我使用了实验性外部表连接器( apiHubTable 作为技术名称)。

连接器从我的On-Premise表中检索数据,但查询未执行(我总是拥有表的完整内容):

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?另一个 ?你有样品吗? 这个功能还没有实现吗?

1 个答案:

答案 0 :(得分:0)

过滤器以OData"语言"表示。 (OData website),因为与On Premise SQL Server的连接是与Logic App相同的数据网关(在Logic App的逻辑应用程序中用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 / Data Gateway会在datetimeoffset(T-SQL类型)中转换datetime。如果您的表字段的类型为datetime,则可能会出现一些问题。

这个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();
}