J'ai une interface qui ressemble à ce qui suit:Get prédicats <T> Info propriété
public IEnumerable<IDocument> Search(Predicate<IDocument> predicate) { ... }
où un IDocument ressemble à ceci:
public interface IDocument
{
string Id {get; set;}
string Title {get; set;}
...
}
Je suis sur le point de mettre en œuvre un fournisseur de documents où je dois décomposer le contenu du Predicate et extrayez les propriétés afin de créer une chaîne SQL pour une base de données de documents pour laquelle nous n'avons actuellement aucun mappage OR/M. Un exemple: Je veux savoir si l'utilisateur recherche par ID ou par titre, donc je sais si je peux effectuer une recherche par ID ou si je dois effectuer une recherche LIKE sur le titre. J'ai toujours beaucoup utilisé LINQ mais c'est la première fois que je suis assis à l'autre bout du pipeline ... J'ai lu un peu sur Expression trees et Reflection mais les morceaux ne sont pas tombés en place pour le moment. Comment (si?) Puis-je décomposer/refléter le prédicat afin d'obtenir une liste de paramètres que je peux concaténer en une chaîne SQL? Je cherche quelque chose comme ce croquis:
public IEnumerable<IDocument> Search(Predicate<IDocument> predicate)
{
string id = DoSomeMagic(predicate, "Id");
string title = DoSomeMagic(predicate, "Title");
if (!string.isNullOrEmpty(id))
...make ID search
else
...search by title
}
Avertissement: Le fournisseur est un ancien système inhouse lié au remplacement de cet automne qui rend SQL en ligne un bon choix; o)
C'est ce que nous avons décidé faire. L'arbre d'expression que nous devrions construire deviendrait extrêmement complexe, donc nous nous sommes rapprochés d'un prédicat et utilisons une approche plus KISS. – kerbou