2017-09-05 104 views
0

創建使用Azure表存儲作爲輸入綁定並嘗試檢索多個實體的Azure函數時而不是隻是一個單一的enntity我得到以下錯誤:Microsoft.Azure.WebJobs.Host.Tables.TableExtension + TableToIQueryableConverter`1 [TElement]'違反了'TElement'類型的約束

Error: 
Function ($ScheduleTrigger) Error: Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.myTimerTrigger'. Microsoft.Azure.WebJobs.Host: GenericArguments[0], 'Submission#0+Task', on Microsoft.Azure.WebJobs.Host.Tables.TableExtension+TableToIQueryableConverter`1[  TElement]' violates the constraint of type 'TElement'. mscorlib: GenericArguments[0], 'Submission#0+Task', on 'Microsoft.Azure.WebJobs.Host.Tables.TableExtension+TableToIQueryableConverter`1 [TElement]' violates the constraint of type parameter 'TElement'.  
Session Id: f4a00564b4864fb3a131557dd45924c7  

Timestamp: 2017-09-05T07:48:09.738Z 

我使用的,在這種情況下的代碼,C#定時器觸發如下:

using System; 

public class Task 
{ 
    public string PartitionKey { get; set; } 
    public string RowKey { get; set; } 
    public DateTime Timestamp { get; set; } 
    public string Name { get; set; } 
} 

public static async Task Run(TimerInfo myTimer, IQueryable<Task> inputTable, TraceWriter log) 
{ 
    foreach (var task in inputTable) { 
     log.Info($"Processing task '{task.Name}' at: {DateTime.Now}"); 
    } 
    log.Info($"Timer trigger executed at: {DateTime.Now}"); 
} 

回答

3

我已經找到了答案以上我自己,但由於錯誤信息沒有得到我一個答案很快我figur我會發布並自己回答這個問題。 https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-table

簡單的改變上面下面的代碼示例會修復這個錯誤:

using System; 

public class MyInput : TableEntity 
{ 
    public string Name { get; set; } 
} 

public static async Task Run(TimerInfo myTimer, IQueryable<MyInput> inputTable, TraceWriter log) 
{ 
    foreach (var item in inputTable) { 
     log.Info($"Processing item '{item.Name}' at: {DateTime.Now}"); 
    } 
    log.Info($"Timer trigger executed at: {DateTime.Now}"); 
} 
+0

他們可能有類似'IQueryable 其中TEntity:TableEntity'的代碼,那麼你會得到一個錯誤消息,因爲你的實體類型沒有滿足約束條件。 – juunas

+0

你的意思是命名你的TableEntity類'Task'嗎?這將與內置的System.Threading.Task衝突。 –

+1

@麥克斯這確實是一個糟糕的命名選擇。它在實際代碼中被重新命名,並且爲了好的措施,我會在這裏更改它以確保沒有人意外複製它。 –

1

如這裏所描述的錯誤是因爲我用我的實體模型不從EntityTable派生引起的

對於IQueryable < T>綁定,T必須是TableEntity。請注意,綁定到IQueryable會忽略其他綁定屬性(分區鍵,行鍵,過濾器,take)。

但是,你只是在這裏使用一個foreach,所以你可以做簡單的綁定。 我們有一個工作項直接綁定到T [](其中T沒有約束)。 https://github.com/Azure/azure-webjobs-sdk/issues/972。隨意Upvote,如果它會對你的情況有用。