LINQ to XML. Version 1.1



Documents pareils
Sommaire. 2 LINQ to Objects

Créer et partager des fichiers

Déploiement et monitoring

Création et Gestion des tables

COMPRENDRE LES DIFFERENTS TYPES DE CONNEXION LORS DE LA

Document Object Model (DOM)

Encryptions, compression et partitionnement des données

Reporting Services - Administration

Traduction des Langages : Le Compilateur Micro Java

WINDOWS SHAREPOINT SERVICES 2007

Le langage SQL Rappels

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Recycle Bin (Corbeille Active directory)

BIRT (Business Intelligence and Reporting Tools)

Cahier Technique. «Développer une application intranet pour la gestion des stages des étudiants» Antonin AILLET. Remi DEVES

Générer du code à partir d une description de haut niveau

SQL Server Installation Center et SQL Server Management Studio

La double authentification dans SharePoint 2007

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

A. Architecture du serveur Tomcat 6

Information utiles. webpage : Google+ : digiusto/

Présentation du langage et premières fonctions

Dossier Technique. Détail des modifications apportées à GRR. Détail des modifications apportées à GRR Le 17/07/2008. Page 1/10

Sage 100 CRM - Guide de la Fusion Avancée Version 8. Mise à jour : 2015 version 8

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

Création d une application JEE

Sélection d un moteur de recherche pour intranet : Les sept points à prendre en compte

La base de données dans ArtemiS SUITE

BD et XML : Exercices

Chapitre VI- La validation de la composition.

Sauvegarde des bases SQL Express

Paginer les données côté serveur, mettre en cache côté client

Ingénierie Dirigée par les Modèles. Editeurs de modèles. (Eclipse Modeling Tools) Jean-Philippe Babau

GOL502 Industries de services

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Langage SQL : créer et interroger une base

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server

TP1 : Initiation à Java et Eclipse

Flex. Lire les données de manière contrôlée. Programmation Flex 4 Aurélien VANNIEUWENHUYZE

Administration Centrale : Opérations

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Programmation Orientée Objet en C#

CREATION WEB DYNAMIQUE

< Atelier 1 /> Démarrer une application web

Accès aux bases de données

Documentation : Réseau

AWS avancé. Surveiller votre utilisation d EC2

DotNet. Plan. Les outils de développement

Installation de SCCM 2012 (v2)

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

TP 1. Prise en main du langage Python

Gestion de l authentification et des autorisations

Site web de Support : Manuel utilisateur

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

GPO. Stratégie de groupe dans un environnement Active Directory. Nathan Garaudel PCplus 01/01/2014

Bases de données relationnelles

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Introduction aux services Active Directory

Connexion à SQL server

Interagir avec le SharePoint. Version 1.0

Gestion du cache dans les applications ASP.NET

Créer une base de données vidéo sans programmation (avec Drupal)

Drupal Développeur. Theming et développement pour Drupal. Une formation Formateur : Fabien Crépin. Drupal Développeur.

Devenez un véritable développeur web en 3 mois!

Le langage C. Séance n 4

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Compte Rendu d intégration d application

Introduction aux concepts d ez Publish

La gestion des exceptions

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Utilisation du BDE pour la maintenance des fichiers DBF de l'application TopoCad:

Gestion de stock pour un magasin

clef primaire ; clef étrangère ; projection ; restriction ; jointure ; SQL ; SELECT ; FROM ; WHERE

SUPPORT DE COURS / PHP PARTIE 3

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

SSIS Implémenter un flux

Base de données relationnelle et requêtes SQL

Jade. Projet Intelligence Artificielle «Devine à quoi je pense»

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

Les déclencheurs. Version 1.0. Grégory CASANOVA

Encyclopaedia Universalis Guide d utilisation

Host Integration Server 2000

Table des matières Avant-propos... V Scripting Windows, pour quoi faire?... 1 Dans quel contexte?

OCL - Object Constraint Language

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Hébergement et configuration de services WCF. Version 1.0

OpenPaaS Le réseau social d'entreprise

Unix/Linux I. 1 ere année DUT. Université marne la vallée

KWISATZ_TUTO_module_magento novembre 2012 KWISATZ MODULE MAGENTO

Introduction à MATLAB R

Ingénérie logicielle dirigée par les modèles

Création d objet imbriqué sous PowerShell.

Comment se connecter au dossier partagé?

La base de données XML exist. A. Belaïd

IFIPS 5 / Nouvelles Architectures Logicielles Projet : Bus de web services avec «moteur» BPEL

Manuel utilisateur Portail SAP

GUIDE D INSTALLATION DE L APPLICATION GECOL SUR

Transcription:

LINQ to XML Version 1.1 Z

2 Chapitre 04 - LINQ to XML Sommaire 1 Présentation... 3 2 Les différentes classes de LINQ to XML... 4 2.1 «XDocument» et «XElement» :... 4 2.2 «XAttribute» et «XComment» :... 5 3 Les méthodes et propriétés... 5 3.1 Méthodes de «XDocument» (hérite de «XContainer») :... 6 3.2 Méthodes de «XElement» (hérité de «XContainer») :... 7 4 Différentes utilisations de LINQ to XML... 9 5 Exemples... 11 6 Conclusion... 15

3 Chapitre 04 - LINQ to XML 1 Présentation LINQ permet d établir des requêtes sur du XML de manière générique. C'est-à-dire que LINQ n est pas un langage qui permet de réaliser ces requêtes exclusivement dans du XML. LINQ permet également la récupération de données depuis une base de données SQL, des objets, etc. Dans ce chapitre, nous allons nous intéresser au LINQ to XML, aussi appelé XLinq. Dans le but d utiliser LINQ to XML, il est utile d ajouter la librairie «System.Xml.Linq». Afin de mieux comprendre ce chapitre, il est conseillé d avoir déjà lu les chapitres «Introduction au LINQ» et «LINQ to Objects». Vous y trouverez notamment des définitions, des mots-clés, la syntaxe, l utilisation de LINQ dans un projet, etc. De plus, le chapitre Windows Form ou ASP.NET «XML (ADO.NET)» permet une meilleure compréhension du langage XML. Voici un diagramme de classe de System.Xml.Linq :

4 Chapitre 04 - LINQ to XML 2 Les différentes classes de LINQ to XML Pour commencer, nous allons apprendre à nous servir de XLinq et plus précisément de ses classes. Contrairement au XML où les classes sont préfixées de «Xml», dans LINQ to XML celles-ci sont préfixées de «X». Par exemple, «XmlDocument» devient «XDocument», «XmlElement» devient «XElement», etc. Afin de mieux découvrir ces classes, nous illustreront nos explications d exemples. Nous créerons dans un premier temps un document XML, aucune requête LINQ ne sera réalisée pour le moment. 2.1 «XDocument» et «XElement» : C# XDocument document = new XDocument( new XElement("Racine", new XElement("Test", "Contenu"), new XElement("Test2", new XElement("Fils","Test réussi")), new XElement("Test3", "Contenu"))); Console.WriteLine(document); Console.Read(); VB.NET Dim document As XDocument = <?xml version="1.0" encoding="utf-8"?> <Racine> <Test>Contenu</Test> <Test2> <Fils>Test réussi</fils> </Test2> <Test3>Contenu</Test3> </Racine> Console.WriteLine(document) Console.Read() «XDocument» correspond au document XML. «XElement», lui, correspond à un nœud. En VB.NET, la déclaration du document XML doit être placée au début de la création de celui-ci pour qu il soit correctement considéré comme un «XDocument». Dans le cas contraire, il sera considéré comme un «XElement» ce qui provoquera une erreur. En C#, cette ligne de déclaration est rajoutée automatiquement. Les types «XDocument» et «XElement» héritent tous deux de la classe abstraite «XContainer». Cette classe implémente des méthodes permettant, entre-autre, la recherche d un nœud suivant ou précédent dans un document XML. Cette classe elle-même hérite de la classe «XNode». Dans le cas présent, nous utilisons le constructeur de la classe «XDocument» qui prend en paramètre tous les éléments de type XML pouvant être inclus dans un document du même type. «XElement» est assez similaire à la seule différence qu il attend en premier argument le nom qui lui sera attribué. De la même manière qu en XML, «XDocument» crée l instruction de traitement. Par défaut, l encodage des caractères est «UTF-8» et la version est «1.0».

5 Chapitre 04 - LINQ to XML 2.2 «XAttribute» et «XComment» : C# XDocument document = new XDocument( new XElement("Racine", new XAttribute("id","test"), new XElement("Test", "Contenu"), new XElement("Test2", new XAttribute("ID", "0"), new XElement("Fils","Test réussi")), new XComment("Voici un commentaire"), new XElement("Test3", "Contenu"))); Console.WriteLine(document); document.save(@"c:\myproject\consoleapplication3\consoleapplication3\test.x ml"); Console.Read(); VB.NET Dim document As XDocument = <?xml version="1.0" encoding="utf-8"?> <Racine id="test"> <Test>Contenu</Test> <Test2 ID="0"> <Fils>Test réussi</fils> </Test2> <!--Voici un commentaire--> <Test3>Contenu</Test3> </Racine> Console.WriteLine(document) Console.Read() «XAttribute» crée un attribut et prend comme argument le nom de cet attribut et sa valeur. L élément «XComment» crée un commentaire et ne prend un «String» en argument représentant le contenu du commentaire. L élément «XDeclaration», quant à lui, permet de spécifier ou d obtenir la déclaration pour le traitement du document XML. Il est notamment demandé la version du document et l encodage des caractères. 3 Les méthodes et propriétés Il est utile de connaitre les classes inhérentes à LINQ to XML, mais il sera encore plus intéressant d en connaitre les méthodes et propriétés. Les tableaux ci-dessous décrivent les méthodes et propriétés disponibles pour les classes vues précédemment.

6 Chapitre 04 - LINQ to XML 3.1 Méthodes de «XDocument» (hérite de «XContainer») : Méthodes / Propriétés CreateReader CreateWriter Declaration DescendantNodes Descendants DocumentType Elements Load Nodes RemoveNodes ReplaceNodes Root Save Description Crée un XmlReader pour le nœud courant. Créer un XmlWriter pour le nœud courant. Obtient ou définit la déclaration du document. Retourne une collection des nœuds descendant contenus dans le document ou le nœud courant. Retourne une collection des éléments descendant contenus dans le document ou le nœud courant. Surchargé. Obtient la définition du type du document(ou DTD) pour ce document. Retourne une collection qui contient les éléments enfants correspondant au document ou à l élément passé en argument. Surchargé. Permet de créer un XDocument. Elle prend en argument le lien vers le fichier, un TextReader, ou encore un XmlReader. Surchargé. Retourne une collection des nœuds enfants de l élément courant ou du document. Supprime les nœuds enfants de l élément courant ou du document. Remplace les nœuds enfants de l élément courant ou du document par les arguments spécifiés. Surchargé. Obtient le nœud racine du document XML. Permet de sauvegarder le XDocument vers le fichier spécifié (s il n existe pas il sera créé). Il peut aussi prendre en argument un TextWriter ou un XmlWriter. Surchargé.

7 Chapitre 04 - LINQ to XML 3.2 Méthodes de «XElement» (hérité de «XContainer») : Méthodes / Propriétés Add AddAfterSelf AddBeforeSelf AddFirst Attribute Attributes CreateReader CreateWriter Element ElementsAfterSelf ElementsBeforeSelf FirstNode DescendantNodes Descendants HasAttributes HasElements IsEmpty LastNode NextNode Ajoute les arguments en tant qu enfant de cet élément. Surchargé. Ajoute les arguments immédiatement après l élément. Surchargé. Ajoute les arguments immédiatement avant l élément. Surchargé. Ajoute les arguments en tant que premier enfant. Surchargé. Retourne l attribut de cet élément au nom spécifié. Retourne une collection de tous les attributs de l élément courant. Surchargé. Créer un XmlReader pour le nœud courant. Créer un XmlWriter qui peut être utilisé pour ajouter des nœuds au conteneur courant. Retourne le premier élément enfant correspondant au nom spécifié. Retourne une collection contenant les éléments adjacents à cet élément qui se trouvent après celui-ci et qui correspondent au nom spécifié. Surchargé. Retourne une collection contenant les éléments adjacents à cet élément qui se trouvent avant celui-ci et qui correspondent au nom spécifié. Surchargé. Obtient le premier nœud enfant du nœud courant. Retourne une collection de tous les nœuds se situant après le nœud courant. Retourne une collection de tous les nœuds se situant après le nœud courant qui correspondent à l élément actuel ou au document. Surchargé. Retourne un booléen définissant si le nœud en question possède au moins un attribut. Retourne un booléen définissant si le nœud contient au moins un élément enfant. Retourne un booléen définissant si l élément contient une valeur. Obtient le dernier nœud enfant du nœud courant. Obtient le nœud adjacent suivant le nœud courant.

8 Chapitre 04 - LINQ to XML NodeType Nodes NodesAfterSelf NodesBeforeSelf Parent PreviousNode Remove RemoveAttributes RemoveNodes ReplaceNodes ReplaceWith Save SetAttributeValue SetElementValue Value Obtient le type du nœud courant. Retourne une collection des nœuds enfants de l élément courant ou du document. Retourne une collection contenant les nœuds adjacents se trouvant après ce nœud. Retourne une collection contenant les nœuds adjacents se trouvant avant ce nœud. Obtient le nœud parent du nœud courant. Obtient le nœud précédent du nœud courant. Supprime ce nœud. Supprimer tous les attributs de l élément courant. Supprime les nœuds enfants de l élément courant ou du document. Remplace les nœuds enfants par les arguments spécifiés. Surchargé. Remplace ce nœud par les arguments spécifiés. Surchargé. Sauvegarde l arborescente XML du nœud dans un fichier, un «XmlTextWriter», un «TextWriter» ou encore un «XmlWriter». Permet de définir la valeur, de supprimer ou d ajouter un élément enfant. Permet de définir la valeur, de supprimer ou d ajouter un élément enfant. Obtient le contenu de cet élément.

9 Chapitre 04 - LINQ to XML 4 Différentes utilisations de LINQ to XML Il est conseillé, avant de continuer, d avoir pris connaissance du chapitre «Introduction au LINQ», du chapitre sur «LINQ to Objects» et du chapitre Windows Form ou ASP.NET «XML (ADO.NET)». Cela dit, dans un souci de compréhensions, nous effectuerons certains rappels. LINQ to XML peut être utilisé pour effectuer des requêtes dans un «XDocument» ou également dans une base de données dont les informations seront stockées dans un «XDocument» ou un «XElement». Des exemples de différentes difficultés sont à venir. C# Requête sur un «XDocument» : XDocument doc = new XDocument( new XElement("Racine", new XElement("Element", new XAttribute("special", "Admin"), "Utilisateur Admin"), new XElement("Element", "Utilisateur Normal"), new XElement("PasElement", "Utilisateur"))); IEnumerable<XElement> test = from i in doc.descendants("element") select i; foreach (XElement e in test) { Console.WriteLine(e +"\n"); } Console.Read(); VB.NET Dim doc As XDocument = <?xml version="1.0" encoding="utf-8"?> <Racine> <Element special="admin">utilisateur Admin</Element> <Element>Utilisateur Normal</Element> <PasElement>Utilisateur</PasElement> </Racine> Dim test As IEnumerable(Of XElement) = From i In doc.descendants("element") _ Select i For Each e In test Console.WriteLine(e.ToString() + vbnewline) Next Console.Read() Voici le résultat de ces requêtes :

10 Chapitre 04 - LINQ to XML Explication : Tout d abord, nous instancions un «XDocument» dans lequel nous créons une arborescence XML contenant des données. Cela va nous permettre d établir des requêtes sur celui-ci. Ensuite, nous créons un objet qui contient la requête. Enfin nous procédons à un affichage des données grâce à un «foreach». Revenons sur la requête pour un petit rappel. L élément suivant le mot-clé «From» correspond à la variable qui sera utilisée comme alias pour la source de données. Le mot-clé «In» défini la source de données contenant les informations souhaitées. Dans notre cas, la source de données est composée des descendants du document (tous les nœuds du document) qui ont pour nom «Element». Nous pouvons constater que le nœud s appelant «PasElement» n a pas été pris en compte par la requête et ne s affiche pas dans la console. Le mot-clé «Select» permet de définir ce que l on veut sélectionner et donc retourner. Ici, nous voulons la valeur «i» de type «IEnumerable» de «XElement». Voici une nouvelle requête sur un autre élément qu un «XDocument» : En définitif, cela revient à effectuer une requête classique que nous allons formater en XML et que nous stockerons dans un «XDocument». C# XDocument doc = new XDocument( new XElement("Utilisateurs", from util in bdd.utilisateur select new XElement("Utilisateur", new XAttribute("ID", util.id), new XElement("Nom", util.nom), new XElement("Prenom", util.prenom)))); Remarque : Il n existe aucun équivalent en VB.NET. Explication : Dans un premier temps, nous créons un document XML à l aide de l instruction «new». Ensuite, le premier élément de ce document doit être un nœud racine. «XElement» attend comme argument le nom d un nœud puis son contenu. Dans notre code, nous effectuons une requête LINQ afin de récupérer des valeurs pour nos nœuds suivants et les rattacher au nœud parent (qui est le nœud racine). Ces données peuvent provenir de toute source de données interrogeables avec LINQ. Dans la requête ci-dessus, on récupère une table «Utilisateur» dans son intégralité et on crée un alias sur la table qui s appelle «util». Notre requête se termine par un «Select new XElement» permettant de récupérer les données sous ce même type à la place d un tableau classique. Nous créons ainsi l arborescence du fichier XML. Les informations de la source de données sont stockées dans des «XElements» avec leur «XAttribute». Ils seront donc identifiables par des ID. Remarque : Il est aussi possible de récupérer cela dans un «XElement» plutôt qu un «XDocument». Cela peut permettre par exemple de l ajouter dans un document XML déjà existant.

11 Chapitre 04 - LINQ to XML 5 Exemples Dans cette partie, nous présentons quelques exemples d utilisation de LINQ to XML. Nous réalisons notre premier exemple en utilisant un «XDocument». C# XDocument doc = new XDocument( new XElement("Racine", new XElement("Utilisateur", new XAttribute("Recherche","Trouvé")), new XElement("UtilisateurAvecEnfant", new XElement("Utilisateur","Enfant", new XAttribute("Recherche", "Perdu"))), new XElement("Utilisateur", new XAttribute("Recherche","Perdu"), "Contenu du noeud"))); Console.WriteLine(doc); //On peut l'afficher pour vérifier si sa fonctionne VB.NET Dim doc As XDocument = <?xml version="1.0" encoding="utf-8"?> <Racine> <Utilisateur Recherche="Trouvé"/> <UtilisateurAvecEnfant> <Utilisateur Recherche="Perdu">Enfant</Utilisateur> </UtilisateurAvecEnfant> <Utilisateur Recherche="Perdu"/> </Racine> Console.WriteLine(doc) Voici le résultat de l affichage de ce code : Nous allons maintenant créer une requête permettant de récupérer le nœud correspondant à un «Utilisateur» qui a l attribut «Recherche» avec la valeur «Trouvé».

12 Chapitre 04 - LINQ to XML C# IEnumerable<XElement> requete = from d in doc.root.descendants() where d.name == "Utilisateur" && d.attribute("recherche").value == "Trouvé" select d; VB.NET Dim requete As IEnumerable(Of XElement) = From d In doc.root.descendants() _ Where d.name = "Utilisateur" _ And d.attribute("recherche").value = "Trouvé" _ Select d L image ci-contre illustre le résultat retourné par cette commande si nous l affichons. Si nous retirons la deuxième condition, il y a deux nœuds «Utilisateur» pris en compte par la requête.

13 Chapitre 04 - LINQ to XML L exemple suivant est un peu plus complet. En effet, nous utiliserons deux documents XML afin de montrer un peu plus les capacités de LINQ to XML. C# XDocument doc = new XDocument( new XElement("Racine", new XElement("Utilisateur", new XAttribute("id","0")), new XElement("UtilisateurAvecEnfant", new XAttribute("id", "1")), new XElement("Utilisateur", new XAttribute("id","0")))); XDocument doc2 = new XDocument( new XElement("Racine", new XElement("Manager", new XAttribute("id", "0")), new XElement("Stagiaire", new XAttribute("id", "1")))); IEnumerable<XElement> requete = from d in doc.root.descendants() from d2 in doc2.root.descendants() where d.attribute("id").value == d2.attribute("id").value select new XElement("Utilisateur", d2.name); foreach (XElement e in requete) { Console.WriteLine(e); } VB.NET Dim doc As XDocument = <?xml version="1.0" encoding="utf-8"?> <Racine> <Utilisateur id="0"/> <UtilisateurAvecEnfant id="1"/> <Utilisateur id="0"/> </Racine> Dim doc2 As XDocument = <?xml version="1.0" encoding="utf-8"?> <Racine> <Manager id="0"/> <Stagiaire id="1"/> </Racine> Dim requete As IEnumerable(Of XElement) = From d In doc.root.descendants() _ From d2 In doc2.root.descendants() _ Where d.attribute("id").value = d2.attribute("id").value _ Select New XElement("Utilisateur", d2.name) For Each e In requete Console.WriteLine(e) Next

14 Chapitre 04 - LINQ to XML Le résultat de la requête est affiché cicontre. La création de document XML ayant été déjà vue précédemment, nous passons cette partie du code. La requête, quant à elle, est plus intéressante à analyser. Pour les deux documents créés, nous récupérons le nœud racine ainsi que ses descendants grâce à l instruction «doc.root.descendants()». L élément ainsi récupéré est une collection de «XElement» contenant respectivement les utilisateurs et les statuts. Dans le premier document XML, nous pouvons remarquer un «id» qui est, grâce à notre requête, lié à un «id» correspondant au deuxième document, dans le but de récupérer le statut de chaque utilisateur. Pour effectuer cela, nous avons utilisé deux instructions «From», mais nous aurions pu très bien opter pour l utilisation de l instruction «Join» qui aurait produit le même résultat. L instruction «Where» juste après nous permet de créer la liaison entre les «id» des deux documents XML. Enfin, nous utilisons l instruction «Select» afin de spécifier les informations que l on souhaite que la requête nous retourne. Pour chaque «Utilisateur» et «Statut» avec un «id» équivalent, nous demandons un nouveau «XElement» ayant pour nom «Utilisateur» et pour valeur le nom du statut de celui-ci. Pour l affichage, nous exécutons un «foreach» qui parcourra le «IEnumerable» renvoyé par la requête afin d afficher chacune des valeurs contenues dans celui-ci.

15 Chapitre 04 - LINQ to XML 6 Conclusion Ce chapitre sur LINQ to XML aborde les notions essentielles sur la manipulation de documents XML dans vos projets Windows Form ou Web Form. Il vous sera aussi utile de prendre connaissance des chapitres «Introduction au LINQ», «LINQ to Objects» et «XML (ADO.NET)» dans les chapitres Windows Form. Les mots-clés de LINQ vous permettront d établir toute sorte de récupération de données sur des documents XML en utilisant les méthodes et propriétés des classes présentées dans ce chapitre. Plus d information sur MSDN : http://msdn.microsoft.com/fr-fr/library/system.xml.linq.aspx