0
votes

Comment créer de manière dynamique l'expression > pour le compte et le groupe par clause

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 commentaires

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 Cela pourrait aider: Stackoverflow.com/questions/31251571/...


3 Réponses :


1
votes

Je ne suis pas familier avec COSMODB, mais ne serait-il pas plus facile pour cela? XXX PRE>

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


2 commentaires

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 ?




0
votes

compte et groupby sont des méthodes. Donc, vous avez d'abord besoin d'obtenir le MethodInfo à l'aide de la réflexion (prenez soin d'obtenir les méthodes à partir de la classe requête , pas énumérable , et le surcharge correcte!).

Créez ensuite une expression d'appel de méthode à l'aide de expression.Call (null, méthodyinfo, requérablement) . (Le premier paramètre doit être null car les deux méthodes sont statiques.) Ici, requérant est le iquéryable Vous avez déjà construit sur ce point sur ce point que vous voulez appeler compter ou groupby , respectivement. Pour GroupBy , vous devez également ajouter un paramètre supplémentaire, qui est l'expression Lambda pour la projection de la propriété de la ville - Je suppose que vous savez comment construire cela.

Mise à jour

Mais si je comprends votre motivation correctement, vous essayez de construire de manière dynamique un iquéryable avec où-clauses, sélectionne, groupeby et / ou comptes, en fonction de la base iquéryable Vous obtenez de la bibliothèque, est-ce correct?

Dans ce cas, vous ne devrait pas Express compter et groupby comme expressions. Plutôt, vous devez appeler dynamiquement les méthodes réel , sélectionnez , comptent et groupy Sur votre base iquéryable (pour obtenir un autre iquéryable ), mais construire dynamiquement des expressions Lambda pour les paramètres de ces méthodes. En fin de compte, vous aurez un iquéryable que le fournisseur COSMOS DB LINQ peut évaluer.


2 commentaires

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.