2017-09-05 1 views
0

Lors de la création d'une fonction Azure qui utilise Azure Table Storage comme liaison d'entrée et tente de récupérer plusieurs entités au lieu d'un seul enntity je reçois l'erreur suivante:Microsoft.Azure.WebJobs.Host.Tables.TableExtension + TableToIQueryableConverter`1 [TElement] 'enfreint la contrainte de type' 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 

le code que j'utilise pour le, dans ce cas, le déclencheur C# timer est la suivante:

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

Répondre

3

J'ai trouvé la réponse à moi-même, mais comme le message d'erreur ne m'a pas obtenu une réponse rapidement, je suis Je publierais et répondrais à la question moi-même.

L'erreur est causée parce que le modèle je pour mon entité ne dérive pas de EntityTable comme décrit ici: https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-table

changer simplement l'exemple de code ci-dessus pour ce qui suit corrigera l'erreur:

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

Ils ont probablement quelque chose comme 'IQueryable où TEntity: TableEntity' dans le code, alors vous obtenez un message d'erreur puisque votre type d'entité ne remplit pas la contrainte. – juunas

+0

Voulez-vous dire de nommer votre classe TableEntity 'Task'? Cela entrera en conflit avec System.Threading.Task intégré. –

+1

@ mike-s c'était en effet un mauvais choix de nommage. Il a été renommé dans le code actuel et pour faire bonne mesure, je vais le changer ici aussi pour m'assurer que personne ne le copie accidentellement. –

1

Pour une liaison T> < IQueryable, T doit être une TableEntity. Méfiez-vous que la liaison à IQueryable ignore les autres propriétés de liaison (clé de partition, clé de ligne, filtre, prise).

Cependant, vous utilisez simplement un foreach ici, donc vous pourriez faire des liaisons plus simples. Nous avons un élément de travail à lier directement à un T [] (où T n'a pas de contraintes). https://github.com/Azure/azure-webjobs-sdk/issues/972. N'hésitez pas à Upvote que si ce serait utile dans votre cas.