Linq proxy

Présentation de SPMetal et des proxy Linq


Une grande nouveauté de SharePoint 2010 est l'intégration de LINQ pour accéder aux éléments d'un site. Dans ce cours, nous allons voir les bases de l'utilisation de LINQ pour exécuter des requêtes sur une liste par exemple. Pour ceux qui ignorent ce qu'est LINQ, sachez qu'en gros, c'est une manière d'accéder aux données et de faire des requêtes sur des collections de données. Il ressemble vaguement au SQL mais est clairement plus maniable que ce dernier.

Ce cours est plus une présentation de l'utilisation de LINQ avec SharePoint qu'une présentation de LINQ lui-même, nous expliquerons donc les différentes requêtes utilisées, mais nous n'entrerons pas dans les détails.

Réalisation



Le but de notre exemple va être d'exécuter 4 requêtes LINQ sur une liste SharePoint. Commencez donc par créer une liste que vous nommerez Test Linq sur votre site SharePoint. Ajoutez ensuite 3 colonnes dans cette liste. Vous les nommerez respectivement "Nom", "Prénom" et "Age". Les deux premières colonnes seront du type texte alors que la dernière sera un nombre. Ajoutez ensuite différents éléments dans cette liste. Pour le besoin de l'exemple, voici les 3 éléments que j'ai ajouté :



Notre exemple se basera sur une Visual Web Part. Celle-ci exécutera les requêtes LINQ sur la liste et les présentera le plus simplement du monde dans une SPGridView. Ouvrez donc Visual Studio 2010 et créez un projet du type Visual WebPart que vous nommerez AreaProg.VisualWebParts.ProxyLinq :



L'écran suivant vous propose de choisir le type de déploiement de la solution, mais il semblerait que Sandboxed ne soit pas disponible pour les Visual Web Part. Laissez donc Farm solution coché et créez votre projet. Vous pouvez alors voir que Visual Studio crée automatiquement une Visual Web Part nommée VisualWebPart1. Nous allons devoir renommer cette Web Part pour lui donner un nom un peu plus parlant, cependant, j'ai remarqué que renommer une Web Part est très compliqué car il faut le faire à plusieurs endroits. Nous allons donc procéder autrement. Cliquez avec le bouton droit sur la Web Part et supprimez la. Cliquez ensuite avec le bouton droit sur votre dossier et allez dans Add > New Item et choisissez Visual Web Part. Nommez la ProxyLinq et validez :



Nous sommes donc prêt à entamer la programmation de notre WebPart. La première chose que nous devons faire est d'ajouter la référence à la DLL permettant d'utiliser LINQ pour SharePoint. Pour ce faire, cliquez avec le bouton droit sur le dossier References de votre projet et choisissez Add Reference. Dans la fenêtre qui s'ouvre, choisissez Browse pour aller directement chercher la DLL sur votre disque dur. Celle ci se trouve à l'emplacement suivant : C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI\Microsoft.SharePoint.Linq.dll.

Nous allons maintenant passer à la création de notre SPGridView qui se chargera d'afficher nos éléments. Ici, nous choisirons d'afficher le nom, le prénom et l'age des personnes récupérées dans notre liste. Doublez-cliquez donc sur le fichier ProxyLinqUserControl.ascx et insérez le code suivant dans la partie Source (onglet en bas de la page) :



Nous donnons GridViewList comme ID à notre liste. Nous devrons réutiliser celui-ci dans la partie programmation de notre Visual Web Part. Nous ajoutons ensuite 3 SPBoundedField à la liste. Ce sont des champs qui seront automatiquement liés avec la source de données passée à la liste. Il faut donc être prudent à la propriété DataField qui sera le nom de ce champ dans la source données. Ici, nous devons donc entrer le nom des colonnes de la liste SharePoint.

L'étape suivante consistera à créer une classe qui nous permettra de faire la passerelle (le proxy pour être précis) entre notre Visual Web Part, LINQ et la liste à exploiter. Effectivement, tout cela n'est pas automatiquement géré, mais ce n'est pas compliqué. Effectivement, l'utilitaire SPMetal livré avec SharePoint va nous permettre de générer très facilement une couche d'accès aux données.

Commencez par ouvrir la console de gestion SharePoint 2010 (C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe -NoExit " & ' C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\CONFIG\POWERSHELL\Registration\\sharepoint.ps1 ' "). Une fois celle-ci ouverte, lancez la commande suivante :



Cette commande va nous permettre de générer la couche d'accès aux données pour l'entièreté du site. Le paramètre /web correspond à l'URL du site Web contenant les listes que nous voulons exploiter. Les deux paramètres suivant nous permettent respectivement de définir le chemin d'accès du fichier qui sera généré (donc votre classe) et le namespace de celle-ci. Nous avons repris le namespace de notre projet pour que le fichier s'intègre parfaitement à notre solution.

Retournez maintenant dans votre projet, cliquez sur le bouton droit dessus (dans la fenêtre d'arborescence) et choisissez Add > Existing Item. Allez alors rechercher le fichier généré par SPMetal, c'est-à-dire : C:\ProxyLinqLayer.cs. Une fois ajouté à la solution, pour une question de propreté, sélectionnez ce fichier et faites le glisser dans le dossier ProxyLinq (la Visual Web Part).

Maintenant que la couche d'accès aux données est présente dans votre solution, nous allons l'exploiter. Cliquez donc avec le bouton droit de votre souris sur votre fichier ascx et choisissez View Code pour accéder au code behind de ce contrôle. La première chose que nous allons faire est d'ajouter les directives nécessaires :



Nous allons ensuite créer une référence à notre SPGridView pour pouvoir l'exploiter. Pour ce faire, tapez :



Dans votre classe, mais en dehors de toute méthode. Cette ligne permettra de récupérer la référence à une SPGridView ayant GridViewList comme ID. Placez-vous maintenant dans la méthode :



Et commencez par insérer cette ligne :



Cette ligne va permettre de récupérer le contexte LINQ pour le site sur lequel la Visual Web Part sera placée. Cette classe ne fait pas partie des DLL SharePoint mais bien de la classe que SPMetal a généré. Elle attend en paramètre de son constructeur l'URL du site à exploiter. Le nom de la classe généré sera composé du nom du fichier, sans le .cs, suivi de DataContext. Donc si dans votre commande de génération vous avez défini le paramètre /code sur "MyCode", la classe se nommera MyCodeDataContext.

Tapez ensuite :



Cette ligne va nous permettre de récupérer un objet contenant une référence à la liste Test Linq. Cette liste contiendra des objets du type TestLinqÉlément (TestLinqItem si votre site est en anglais) qui seront des éléments de la liste. Cette classe est également automatiquement générée par SPMetal. Nous devons faire passer le nom de la liste contenant ces éléments en paramètre de la fonction GetList.

Nous avons maintenant tout ce qu'il nous faut pour exécuter des requêtes LINQ, tout ça en deux lignes de code. Tapez donc cette première requête :



Cette requête va simplement nous permettre de récupérer tous les éléments de la liste étant donné qu'il n'y a pas de condition dans cette requête. Nous allons maintenant nous baser sur la QueryString/I] nommée [I]q. Effectivement, pour faire simple, nous avons décidé qu'il suffit de faire passer q=1, 2 ou 3 à l'URL de la page pour exécuter une requête différente. Tapez donc le code suivant :



Nous commençons par nous assurer que la QueryStrng q existe bien. Si ce n'est pas le cas, c'est la première requête définie qui sera exécutée (donc la récupération de tous les éléments). Si la QueryString existe, nous faisons un switch dessus pour tester les différents valeurs. Si celle-ci vaut 1, la requête suivante sera exécutée :



Cette requête se charge de récupérer tous les éléments pour lesquels le champ Age contient une valeur supérieure à 22. Vous remarquerez qu'une conversion de type est automatiquement réalisée. Le champ Age étant de type Number, la propriété Age de l'objet sera du type int. Si la valeur de q vaut 2, c'est cette requête qui sera exécutée :



Cette requête récupèrera toutes les personnes dont le nom contiendra plus de 6 caractères. Vous remarquez donc que, vu que la colonne Nom est du type Ligne de texte, la propriété correspondant sera automatiquement castée en string. Enfin, la dernière requête (si q vaut 3) serait la suivante :



Nous exécutons ici une requête plus complexe. Effectivement, celle-ci récupèrera les personnes dont l'age est plus grand que 15 et dont le nom commence par K ou les personnes dont l'age est égal à 21. Les deux dernières lignes du code permettent respectivement de définir la source de données de la SPGridView et de réaliser la liaison.

Votre WebPart est maintenant terminée. Compilez et déployez-la sur votre site Web. Une fois ceci fait, ouvrez votre site, créez une Web Part Page et rendez-vous dessus. Cliquez alors sur l'onglet Page du Ribbon et cliquez sur Modifier la page. Étant donné que nous n'avons rien changé au fichier de définition de notre WebPart, celle-ci se trouvera dans le dossier Custom sous le nom ProxyLinq :



Cliquez alors sur Ajouter pour ajouter notre WebPart et voir le résultat suivant apparaître :



Étant donné qu'aucune QueryString n'est passée à la page, c'est la requête devant récupérer tous les éléments qui est exécutée. Et comme vous pouvez le voir, tout se passe à merveille. Tous les éléments sont récupérés et bien placés dans la SPGridView. Modifiez ensuite l'URL de la page en rajoutant &q=1. Le résultat deviendra alors :



Cette fois, c'est bien la requête devant afficher toutes les personnes ayant plus de 22 ans qui est exécutée et vous voyez que seule Asli Kargi (ma 'tite (future) femme :p) apparait car elle a plus de 22 ans. Modifiez encore une fois l'URL en remplaçant q=1 par q=2 :



La requête devant récupérer toutes les personnes dont le nom dépasse 6 caractères, cette fois, Asli Kargi n'est pas sélectionnée (Kargi faisant 5 caractères). Par contre, les deux autres personnes sont bien récupérées. Modifiez enfin une dernière fois l'URL en remplaçant q=2 par q=3 :



Cette fois, toutes les personnes sont sélectionnées. Effectivement, Sébastien Sougnez et Pascal Paillocher sont sélectionnés car ils ont 21 ans. Enfin, Asli Kargi est sélectionnée car elle a plus de 15 ans et que son nom commence bien par K.

Vous constatez donc qu'il est extrêmement facile de travailler sur les listes SharePoint grâce à LINQ. La chose à garder à l'esprit que qu'à chaque fois que vous modifierez une liste dans votre site, il vous faudra exécuter à nouveau l'utilitaire SPMetal pour avoir une bonne version du fichier .cs. Maintenant, cela peut être très rapidement fait grâce à un fichier bat.