Je dois créer un prédicat d'expression de Lambda dynamique pour une requête ci-dessous à la requête dans Cosmos DB.
var parameter = Expression.Parameter(typeof(T), "t"); MemberExpression expBody = Expression.Property(parameter, columnName);
3 Réponses :
Je ne suis pas familier avec COSMODB, mais ne serait-il pas plus facile pour cela? EDIT: P> Exemples à ma réponse dans les commentaires -> struct City
{
public string Name { get; set; }
public int Population { get; set; }
}
IQueryable<City> cities = default;
Func<City, bool> HasNastyName = c => c.Name.Length > 25;
Func<City, bool> IsMassive = c => c.Population > 500;
var nastyNameCities = cities.Where(HasNastyName);
var massiveCities = cities.Where(IsMassive);
Comment pouvons-nous faire cela en utilisant Expression Builder comme dans le projet que nous l'utilisons pour créer des prédicats génériques??
Eh bien, je ne suis pas sûr de ce que vous faites exactement, mais la méthode de .where () de Iquérisable prend déjà un prédicat générique, donc si vous utilisez cette approche au lieu de construire un arbre d'expression, je suppose que vous avez déjà ce que vous voulez ?
Je crois que vous pouvez utiliser Dynamic Linq pour cela:
Il y a une extension de groupeby qui prend une chaîne:
https://dynamic-linq.net/basic-query-Opérators#groupbybybyDeight //a > p> La documentation de Dynamic Linq fournit cet exemple p>
Je dois utiliser Expression Builder comme dans le code que nous l'utilisons pour créer des prédicats génériques.
Pouvez-vous fournir un exemple de la façon dont vous utilisez ces prédicats? Est-ce que l'idée que vous avez une sous-requête dans votre clause WHERE?
Créez ensuite une expression d'appel de méthode à l'aide de Mais si je comprends votre motivation correctement, vous essayez de construire de manière dynamique un Dans ce cas, vous strong> ne devrait pas strud> Express compte code> et
groupby code> sont des méthodes. Donc, vous avez d'abord besoin d'obtenir le
MethodInfo code> à l'aide de la réflexion (prenez soin d'obtenir les méthodes à partir de la classe code> requête code>, pas
énumérable code>, et le surcharge correcte!). p>
expression.Call (null, méthodyinfo, requérablement) code>. (Le premier paramètre doit être
null code> car les deux méthodes sont statiques.) Ici,
requérant code> est le
iquéryable code> Vous avez déjà construit sur ce point sur ce point que vous voulez appeler
compter code> ou
groupby code>, respectivement. Pour
GroupBy Code>, vous devez également ajouter un paramètre supplémentaire, qui est l'expression Lambda pour la projection de la propriété code> de la ville code> - Je suppose que vous savez comment construire cela. P>
Mise à jour h3>
iquéryable code> avec où-clauses, sélectionne, groupeby et / ou comptes, en fonction de la base
iquéryable Code> Vous obtenez de la bibliothèque, est-ce correct? P>
compter code> et
groupby code> comme expressions. Plutôt, vous devez appeler dynamiquement les méthodes réel em>
où code>,
sélectionnez code>,
comptent code> et
groupy code > Sur votre base
iquéryable code> (pour obtenir un autre
iquéryable code>), mais construire dynamiquement des expressions Lambda pour les paramètres de ces méthodes. En fin de compte, vous aurez un
iquéryable code> que le fournisseur COSMOS DB LINQ peut évaluer. P>
Oui, tu me as raison. Je veux faire la même chose. Je vais essayer ce que vous avez suggéré et vous le faire savoir.
J'ai essayé mais ne travaille pas, pouvez-vous m'envoyer un exemple de cela.
Utilisez-vous l'entitéFramework? Si oui, il pourrait être utile de vérifier dynamique linq entityframework.net/use-linq-dynamiquement
@Jason Je ne sais pas si le fournisseur CORE COSMOSDB EF prend en charge Dynamic Linq.
Pour
Nombre code> Cela pourrait aider: Stackoverflow.com/questions/31251571/...