Microsoft.Azure.WebJobs.Host.Tables.TableExtension + TableToIQueryableConverter`1 [TElement]'违反了类型' TElement'

时间:2017-09-05 08:41:55

标签: c# azure azure-functions

创建使用Azure表存储作为输入绑定并尝试检索多个实体而不只是单个实体的Azure功能时,我收到以下错误:

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}");
}

2 个答案:

答案 0 :(得分:3)

我自己找到了上面的答案,但由于错误信息没有及时给我答案,我想我会自己发布并回答这个问题。

导致错误是因为我用于实体的模型不是从EntityTable派生的,如下所述: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}");
}

答案 1 :(得分:1)

对于IQueryable&lt; T&gt;绑定,T必须是TableEntity。请注意,绑定到IQueryable会忽略其他绑定属性(分区键,行键,过滤器,带)。

但是,你只是在这里使用foreach,所以你可以做更简单的绑定。 我们有一个工作项直接绑定到T [](其中T没有约束)。 https://github.com/Azure/azure-webjobs-sdk/issues/972。如果它对您的情况有用,请随意Upvote。