Exécution de DynamicExpression avec des types inconnus

c# dynamic-linq expression-trees lambda linq

Question

Si quelqu'un est très familier avec l'espace de noms Linq.Dynamic, j'aurais besoin d'aide - je ne pouvais trouver aucune ressource en profondeur sur Internet.

Fondamentalement, j'utilise DynamicExpression.ParseLambda pour créer une expression dont le type n'est pas connu au moment de la compilation.

public Expression GetExpression(Type t, List<QueryFilter> filters)
{
   // pseudo code
   // extracts a string representation of the query as 'expressionString'

   return DynamicExpression.ParseLambda(t, typeof(Boolean), expressionString, values);
}

Où QueryFilter est:

public class QueryFilter 
{
    string propertyName;
    ExpressionType operationType;
    object value;
}

Ce qui représente une fonction binaire simple telle que "Age> 15" ou quelque chose.

Voici comment la fonction 'GetExpression' fonctionne: elle prend 2 types: le type d'entrée et le type de sortie, puis génère ce qui serait normalement créé avec un délégué Func. Il faut également une chaîne représentant la requête et un objet params [] de valeurs, qui sont respectivement "expressionString" et "valeurs".

Cependant, je ne parviens pas à exécuter l'expression dynamique dans LINQ-to-SQL avec un DataContext généré à partir de SqlMetal (fichier .dbmc).

DatabaseContext db = new DatabaseContext(connectionString);

var filter = DynamicExpressionBuilder.
      GetExpression(typeof(SysEventLogT), sysEventFilters)

var query = db.SysEventLogT.Where(filter);

Produit l'erreur suivante,

System.Data.Linq.Table<DBReporting.Linq.Data.SysEventLogT>

ne contient pas de définition pour 'Où' et la meilleure surcharge de méthode d'extension

System.Linq.Dynamic.DynamicQueryable.Where<T>(System.Linq.IQueryable<T>, string, params object[]) 

a des arguments non valides.

Je sais que mon instance DataContext traite en fait les tables SQL en tant que propriétés. Dois-je réfléchir avec GetProperty () d'une manière ou d'une autre pour que cela fonctionne? Ou peut-être ai-je besoin de créer une autre extension .Where?

Réponse acceptée

Votre GetExpression renvoie un type Expression - la méthode DynamicQueryable.Where, lorsqu'elle est utilisée comme méthode d'extension, attend une chaîne en tant que premier paramètre.

Vous avez besoin de votre appel à Où ressembler à ceci:

var query = db.SysEventLogT.Where("Age > @0", 15); 

Aussi, vous pouvez essayer ce qui suit, juste pour être explicite:

var query = db.SysEventLogT.AsQueryable().Where("Age > @0", 15); 

Notez que si cela vous est plus facile, vous pouvez construire un fichier contenant le filtre complet sans utiliser le paramètre params object []:

var query = db.SysEventLogT.AsQueryable().Where("Age > 15"); 


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow