Question

J'ai essayé différentes manières d'utiliser les requêtes dynamiques LINQ - LINQKit et Bibliothèque de requêtes dynamiques LINQ. Je n'aime pas le second car cela tue l’idée de LINQ - être capable de vérifier les requêtes au moment de la compilation. Et avec LINQKit, je n'ai pas trouvé un bon exemple pour mon scénario. De plus, je n'aime pas trop l'utilisation de la réflexion.

Mon scénario est le suivant. J'ai un service Web qui fait de la logique métier et de la logique DAL. L'application webforms est séparée. J'ai une page avec des cases à cocher pour chaque champ que l'utilisateur souhaite filtrer, ainsi qu'une zone de texte pour saisir chaque valeur de filtre. Mon service Web a une méthode GetByFilter où je passe une liste. QueryObject est une classe avec la chaîne suivante: filedName, object: fieldValue.

Ensuite, mon service Web reçoit une liste d'objets de requête et pose maintenant la grande question: comment le traduire en requête LINQ si le nombre de champs et les valeurs de filtre peuvent varier?

Ce qui est encore pire - je n’utilise pas LINQ2SQL mais j’utilise un DAL personnalisé avec des référentiels qui peuvent renvoyer IQuery si nécessaire (comme celui-ci: http://msdn.microsoft.com/en-us/magazine/dd569757. aspx faites défiler jusqu'à Repository).

Je sais que je peux utiliser la pagination avec LINQ2SQL: var PagedData = query.Skip ((iPageNum - 1) * iPageSize) .Take (iPageSize);

Alors, comment puis-je obtenir les paramètres de requête dynamiques (et iPageNum et iPageSize) de LINQ vers mon implémentation DAL sous-jacente pour exécuter ces requêtes d’une manière spécifique au fournisseur de données? Peut-être que je dois implémenter mon DAL en tant que fournisseur de données LINQ (je ne sais pas comment le faire)?

Le problème est le suivant: je ne veux pas dépendre de LINQ2SQL (je pourrais alors simplement implémenter mes référentiels en tant que wrappers pour LINQ2SQL), mais je souhaite également disposer de capacités d'interrogation LINQ partout en dehors de mon DAL. Est-ce possible?

Était-ce utile?

La solution

Vous pouvez certainement créer votre propre IQueryable, un "fournisseur LINQ personnalisé"

.

Voici l'article de MSDN: http://msdn.microsoft.com/ en-us / library / bb546158.aspx et Matt Warren a une série de blogs à ce sujet: http://blogs.msdn.com/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx

Je vous recommande de commencer par le voir pour voir à quel point cela pourrait être difficile et si cela en vaut la peine pour vous!

Si vous vous y opposez, lisez ce billet: http: // www. .hanselman.com / blog / RealWorldAppsInDaysNotWeeks.aspx et voyez si ADO.Net Data Services (Astoria) vous est utile

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top