J'ai une application Silveright qui permet aux utilisateurs de spécifier des filtres sur quelques ensembles différents de données persistantes. Les données persistantes peuvent être XML ou une table de base de données relationnelle. J'utilise nHibernate pour la couche de base de données car je dois supporter différentes options de base de données, Postgresql et MySQL au minimum. Les champs de filtrage varient en fonction de l'ensemble de données interrogé.
Pour l'instant, le filtre est transmis du client Silverlight au serveur sous la forme d'une chaîne de caractères et j'utilise la balise LINQ dynamique sur le serveur pour le convertir en une requête LINQ. Cela fonctionne bien pour le cas XML où toutes les données ont été chargées en mémoire, mais je ne suis pas sûr que ce soit la meilleure approche pour la base de données.
Je me demande si la meilleure approche consiste à envoyer le filtre sous forme de chaîne de caractères à partir du client, puis à l'analyser avec la bibliothèque Dynamic LINQ. Pourrai-je utiliser les requêtes LINQ générées avec nHibernate ? Ou devrais-je envisager de sérialiser un objet Expression dans Silverlight et de le transmettre au serveur ? Ou existe-t-il un autre moyen ?
J'ai besoin que mes objets persistants fournissent une interface standard pour l'accès et il y en a un certain nombre. Il n'est donc pas possible de fournir une interface de méthode différente pour chaque filtre requis.
Vous trouverez ci-dessous un exemple de l'interface prise en charge par mes classes de persistance. La partie qui me pose problème est l'expression whereExpression.
public interface ICustomerPersistor
{
Customer Add(Customer customer);
Customer Update(Customer customer);
Customer Delete(Customer customer);
Customer Get(Guid customerId);
int Count(string whereExpression);
Customer Get(string username, string password);
List<Customer> Get(string whereExpression, int offset, int count);
}