2017-02-15 37 views
1

我創建了一個Azure函數(C#)來從內部部署SQL Server數據表中提取數據。我使用了實驗室外部連接器(apiHubTable作爲技術名稱)。在Azure函數中查詢外部表

連接器從我的內部部署表中檢索數據,但不執行查詢(我總是有表的全部內容):

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?另一個 ?你有樣品嗎? 這個功能尚未實現嗎?

回答

0

該過濾器以OData「語言」(OData website)表示,因爲與內部部署SQL Server的連接與邏輯應用程序相比導致了相同的數據網關(過濾器在邏輯應用程序中用於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型)轉換日期時間。如果您的表格字段是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(); 
} 
+0

我可以問你你怎麼包括在ListEntitiesAsync方法查詢? This works: 'Query query = Query.Parse(「$ top = 50」); (查詢); 這不是: 'Query query = Query.Parse(「$ filter = Id eq 5」); var list = await inputTable.ListEntitiesAsync(query);' 也許過濾沒有實現? –