2008-11-03 5 views
4

J'écris une application interne où nous permettons aux utilisateurs de faire différents types de requêtes.Comment analyser un terme de recherche dans les différents types de questions?

L'application permet aux utilisateurs de rechercher une base de données par l'une des touches suivantes:

  • employeeId
  • nom (prénom ou)
  • COMPANYID
  • état (workingFullTime, arrêt maladie, maternityLeave, etc)

La méthode de la force brute consiste simplement à créer un formulaire Web pour chaque type de requête et avoir un menu où l'utilisateur choisit quel type de requête à effectuer (c'est ASP.NET)

Mais ce que je voudrais est d'avoir une simple zone de texte où l'utilisateur entre la requête, puis l'application devrait analyser la requête et automatiquement sélectionnez le type de requête à transmettre à l'arrière.

Par exemple, employeeId est un nombre d'un format précis. Je peux donc faire une expression régulière pour correspondre à cela. Donc, la même chose est vraie pour le statut, companyId, etc

Donc, mes questions sont si quelqu'un ici peut donner des conseils sur la meilleure façon de coder une méthode en C# qui prendra une chaîne et la faire correspondre à un certain nombre de différents réguliers expressions.

Cheers, Joakim

+0

Je pense que pour le statut, je voudrais avoir une forme de sélection, car il semble seulement accepter un certain ensemble de valeurs. Pourquoi ne pas simplement afficher quatre formulaires d'entrée différents et utiliser tous ceux qui ont été remplis resp. sélectionné pour la requête? De cette façon, vous pouvez également faire des requêtes combinées. – Svante

Répondre

1

La voie droite vers l'avant serait d'avoir une séquence de if déclarations de test chaque regex à son tour:

if (Regex.Match(query, regex1)) { 
    HandleFirstCase(query); 
} else if(Regex.Match(query, regex2)) { 
    HandleSecondCase(query); 
} ... 
else { 
    HandleFullTextSearch(); 
} 

Une façon plus sophistiquée serait une approche axée sur des données, où vous stockez les expressions rationnelles et les actions dans une table et bouclez-les:

public class RegexAction { 
    public Regex Pattern { get; private set; } 
    public Action<string> Handler { get; private set; } 
    public RegexAction(Regex pattern, Action<string> handler) { 
     this.Pattern = pattern; 
     this.Handler = handler; 
    } 
} 

public static RegexAction[] HandlerTable = new RegexAction[] { 
    new RegexAction(regex1, HandleFirstCase), 
    new RegexAction(regex2, HandleSecondCase), 
    new RegexAction(regex3, HandleThirdCase), 
    // ... 
} 

foreach(RegexAction action in HandlerTable) { 
    if (action.Match(query)) { 
     action.Handler(query); 
     break; 
    } 
} 

Ceci aide à séparer l'imp données, schémas et actions ortants, à partir de la mise en œuvre des tests et des appels.

1

Ce que je ferais est juste une ou requête:

select * from employee where employeeId = search OR name like "%search%" OR status = "search" 
Questions connexes