Comment faire pour Ajouter une expression
Basé sur ma question d'hier:
si je devais ajouter à mon 'où' expression, comment pourrais-je ajouter?
Expression<Func<Client, bool>> clientWhere = c => true;
if (filterByClientFName)
{
clientWhere = c => c.ClientFName == searchForClientFName;
}
if (filterByClientLName)
{
clientWhere = c => c.ClientLName == searchForClientLName;
}
L'utilisateur peut saisir soit le prénom ou nom de famille, ou les deux. Si ils entrent fois que je veux ajouter à l'expression. En essayant de voir si il y a un équivalent de la concaténation où je pourrait faire
clientWhere.Append or clientWhere += add new expression
ou quelque chose de similaire
- J'ai essayé de trouver des solution similaire, parce que nous utilisons nos vieux ORML outil développé par notre équipe, qui prend en charge ajoutant des opérations par "ET" ou "OU" et notre code dépend fortement de ces où la vulgarisation. Jusqu'à présent, nous ne pouvions pas passer à linq, mais, fondamentalement, linq crée IExpression<T> , et si vous trouvez un moyen de contourner la création de IExpression<T> arbre par vous-même, ça peut aider.
Vous devez vous connecter pour publier un commentaire.
Je crois que vous pouvez juste faire ce qui suit:
Si vous avez besoin de tout garder en
Expression
-terre (à utiliser avecIQueryable
), vous pouvez également effectuer les opérations suivantes:Cela peut être fait en moins verbeux par la définition de cette méthode d'extension:
Vous pouvez ensuite utiliser la syntaxe ressemble à ceci:
2[Models.Client,System.Boolean]' and 'System.Func
2[Modèles.Client,Système.Boolean]'.C'est un scénario complexe. Vous êtes près de la construction de votre propre moteur de recherche en haut de LINQ. JaredPar de la solution (d'où at-il aller?) est excellent si vous voulez un ET logique entre l'ensemble de vos critères, mais qui peut ne pas toujours être le cas.
Quand j'étais en proie à un de mes projet récemment, j'ai créé deux Listes:
(Dans ce cas, T est Client, pour vous)
Je voudrais remplir les Listes avec des prédicats que je veux être fidèle. Par exemple,
Ensuite, je voudrais vérifier à l'encontre de tous les critères dans les Listes dans ma clause where. Par exemple:
Cela pourrait aussi être fait avec une boucle for pour des raisons de lisibilité du saké. N'oubliez pas d'utiliser le bon ordre des opérations lors de l'application de votre OU de et les ET les clauses.
Prendre un coup d'oeil à Prédicat Builder, je crois que cela pourrait fonctionner pour vous.
Son pas exactement la réponse à votre question, mais, je cherchais la même chose que vous, et puis j'ai trouvé une meilleure réponse à ma question.
Au lieu de construire une Expression dynamique, vous pouvez récupérer le IQueryable
et puis filtrer ce que vous voulez comme ceci:
Remarque: j'étais inquiet au sujet de l'exécution de plus d'un ".Où" déclaration parce que j'avais peur que cela permettrait de générer plus d'une requête dans la Base de données, ou parce que j'aurais à retrive tous les dossiers et puis les filtrer, mais ce n'est pas vrai,
Linq dynamique de générer une seule requête que lorsque vous appelez .ToList() la méthode.
Ici vous pouvez voir l'original question que j'ai pris l'exemple de.
Si vous rencontrez un problème similaire, vous pouvez trouver toutes les solutions possibles dans ce grand sujet.
Ou simplement l'utiliser PredicateBuilder est génial helper pour cette poporse.
Il est certains générateur de mise en œuvre.
Ou quelque chose à ajouter à Josh (le Mettre dans mon sac à malices):
J'ai essayé de mettre en œuvre ce genre de trucs. M'a fallu un jour pour découvrir.
Ma solution est basée sur le filtre dans une boucle basée sur un Tableau de prédicat.
Comme une note, il est totalement Générique et une Réflexion sur parce que les seules informations sur la classe et le champ de chaînes de caractères.
Pour faire simple, j'appelle directement le Modèle de la classe, mais dans un projet, il vous faudra passer par un contrôleur qui est d'appeler le Modèle.
Donc, ici, nous allons :
Le Modèle de la partie où T est un Générique dans la catégorie
Maintenant la LambdaExpression Constructeur, c'est une base(avec type de Chaîne ou autre chose) , vous pouvez l'améliorer avec plus de fonctionnalités :
Maintenant l'Appel de la fonction :
L'argument sont :
Chaîne de l'Entité : Entité nom de la classe.
XMLContext : il s de l'unité de travail du référentiel, argument que j'utilise pour initialiser le Modèle de la classe
Hashtable FieldsNameToGet : Indice de valeur/de la liste de le domaine je veux revenir
Hashtable FieldFilter : la clé/Valeur avec FieldName/Contenu utilisé pour faire de l'expression Lambda
Bonne Chance.