2010-12-14 50 views
1

Je suis à la recherche d'un moyen dynamique d'implémenter la recherche dans mon application MVC 1.0. Disons que j'ai un contrôle utilisateur contenant une zone de texte, une liste déroulante et un bouton. L'utilisateur va placer une requête dans la zone de texte, sélectionner la colonne à partir de laquelle effectuer la recherche dans la liste déroulante, puis appuyer sur le bouton de recherche.Option de recherche dynamique dans MVC 1.0

à faire l'activité ci-dessus que je veux faire dans le modèle:

context.MyViewOrTableName.Where(p => (p.ColumnNameFromTheDropdown.Contains(DataFromTheTextbox))); 

Si le scénario ci-dessus est possible dans MVC 1.0 et si oui comment? Toute aide serait appréciée.

Solution:

context.MyViewOrTableName.Where("" + ColumnNameFromTheDropdown + ".Contains(@0)", DataFromTheTextbox); 

Ce qui est arrivé seulement après y compris l'espace de noms System.Linq.Dynamic créé par Scott et renvoyé par Omar dans le poste ci-dessous.

Répondre

1

Ce que vous cherchez est un moyen de construire dynamic LINQ queries. Vous pouvez rechercher quelques détails à ce sujet et les options là-bas, cependant, je crois que le Dynamic Linq library que Scott Guthrie a écrit est exactement ce que vous cherchez.

Il vous permet de construire des requêtes à partir de chaînes:

var query = 
    db.Customers. 
    Where("City = @0 and Orders.Count >= @1", "London", 10). 
    OrderBy("CompanyName"). 
    Select("new(CompanyName as Name, Phone)"); 
+0

Beau point. En fait, je cherche dans cet angle seulement. –

+0

Votre réponse m'a guidé dans la bonne direction. –

2

Je fais actuellement une chose similaire. C'est-à-dire, j'ai une vue MVC qui contient diverses options de recherche (case à cocher, liste déroulante, zone de texte), et je voulais un moyen élégant de retourner "résultats de recherche".

J'ai donc créé une classe simple - par exemple "ProductSearchCriteria".

Cette classe ne contient que des getters/setters pour les différentes options de recherche. (que je remplis lorsque le formulaire est soumis via la liaison de modèle).

Je puis accepte ce type en tant que paramètre sur ma méthode de BLL:

public ICollection<Product> FindProductsForCriteria(ProductSearchCriteria criteria) 
{ 
    return _repository // GenericRepository<Product> 
     .Find() // IQueryable<Product> 
     .WithSearchCriteria(criteria) // IQueryable<Product> 
     .ToList(); // List<Product> 
} 

Quant à comment pour appliquer les filtres, et qui dépend de quelques choses. Premièrement, je ne sais pas si vous utilisez Linq-To-Sql, NHibernate, Entity-Framework, etc. Cela dépend aussi de votre architecture (référentiel).

Vous ne pourrez pas "dynamiquement" appliquer des filtres via des expressions lambda (pas facile, de toute façon).

ce que je faisais était créer une méthode d'extension pour appliquer gracieusement les filtres:

public static IQueryable<Product> WithSearchCriteria(this IQueryable<Product> source, ProductSearchCriteria criteria) 
{ 
    var query = source; 

    if (criteria.SearchFilterOne != null) 
     query = query.Where(x => x.FieldInModel == criteria.SearchFilterOne); 
    // inspect other criteria 
} 

Comme je l'ai dit, cela dépend de votre architecture et ORM. J'utilise Entity Framework 4.0, qui prend en charge l'exécution différée , ce qui signifie que je peux créer des requêtes sur mes objets (IQueryable) et appliquer des filtres avant d'exécuter la requête.

HTH.

+0

@Arup Chaudhury - pas un problème, juste pensé que je devais partager mon expérience. Codage heureux! :) – RPM1984