Tour accès aux données: à mi-parcourt


Bonjour à tous,


Le tour est lancé depuis 15j et nous avons réussi tant bien que mal à traverser la France en slalomant entre les grèves de la Sncf et d’Air France :p.


Malgré ces quelques difficultés de parcours, le tour est bel et bien lancé. Strasbourg, Lille, Nantes et Toulouse furent de belles sessions bien remplies avec entre 50 et 70 participants.


Le tour reprendra après les vacances scolaires (et le TechEd) avec Lyon, Aix et Paris, villes pour lesquelles il est encore temps de s’inscrire (http://msdn2.microsoft.com/fr-fr/data/bb743261.aspx).


Vous pouvez évidemment profiter de ce billet pour poser vos questions ou donner votre avis pour ceux qui ont déjà participé !


A très bientôt,


Mitsu

Comments (19)

  1. Pascal says:

    Le tour c’est très bien passé à Nantes.

    Et surtout cela m’a permis de voir clairement l’intérêt de Linq et de commencer à faire des essais grâce aux exemples très bien expliqué de Mitsu.

    Merci encore pour cette session très passionnante.

  2. Philippe A. says:

    J’étais a Nantes aussi, et franchement la matinée avec Mitsu était vraiment très enrichissante !  linq est une techno qui n’a pas été souvent présenté lors de séminaires, contrairement aux techno visant  la couche de présentation comme WPF ou Silverligth qui avaient été présentés en avant première aux DevDays 2006 (Snif maintenant faut aller a paris !!)

    Linq to SQL, Linq to Object, me semble être un langage clair pour accéder à tout type d’objets (linq to ldap etc…..), Mitsu nous a expliqué en plus, pourquoi cette syntaxe a été choisi, et c’est vrai qu’elle est plus compréhensible pour un développeur  >>  

    Déclaration >>   from Tb in DataContext.VilleTb

    Filtre   >>  where Tb.Nom ==  “Nantes”

    Puis l’élément que l’on retourne  >>   select Tb;

    C’est un peu plus cohérant que le SQL !-) avec l’IntelliSense en +

    Bon pour faire un IN il faut faire :

    String[]  MaListeDeString  = new String[]{“Nantes”, “Angers”, “Noirmoutier”}

    MaListeDeString.Contains(Tb.Nom)

    Pour la personne qui demandait s’il existait Linq to NHibernate :

    http://ayende.com/Blog/archive/2007/03/16/Linq-for-NHibernate.aspx

    http://ayende.com/Blog/archive/2007/03/17/Implementing-Linq-for-NHibernate-A-How-To-Guide–Part.aspx

    Linq to Oracle (j’ai rien trouvé)

    Autrement il y a eu plein de choses intéressante comme les améliorations du langage c# :

    Les méthodes partielles pour implémenter notre propre logique métier dans des fonctions qui sont appelé par les classes partielles générées par Visual studio (DSL). Personnellement je trouve ces classes assez pratiques dans le cas de classes généré par Visual studio, sur lesquels nous n’avons pas la maitrise, par ce biais nous pouvons étendre son comportement en ayant accès à l’ensemble des méthodes et objets sans craindre de perdre nos modifications lors de la manipulation avec les concepteurs graphiques (DSL).  Si vous voulez utiliser votre Model créer avec Linq to sql via WCF, il faudra indiquer le mode de sérialisation dans le concepteur graphique a Unidirectional, ce qui aura pour conséquence de mettre les attributs genre [DataMember] sur les propriétés.

    On a vu également les méthodes d’extensions ou comment étendre les fonctionnalités d’une classe avec une méthode statique à l’extérieur de la classe cible grâce au mot clef this, dans les paramètres de la fonction qui doit précéder le type de la classe cible que l on veut étendre. Je m’en sers, et je trouve cela super pratique, par contre c’est un peu déroutant, car il faut absolument faire un using du namespace dans lequel on a mis les méthodes d’extension pour y avoir accès. On peut distinguer les méthodes d’extension par une flèche a gauche des méthodes. On a vu aussi les types anonymes, un peu de reflexion, et un bon rappel sur les collections génériques.

    Enfin j’ai surement oublié plein de chose, mais merci Mitsu pour cette superbe présentation.

    (Pour l’après midi concernant SilverLight, un petit défaut, les présentations sont tjrs très orienté multimédia, photo, et vidéo, c’est très joli c’est sur, mais je préférerais que les exemples soient un peu plus orienté données B2E, ou B2B avec des problématique d’entreprise et non de e-commerce)

  3. Trop fort ce Mitsu :-)

    Philippe A. :

    Pour Oracle, il faut utiliser LINQ To Entities.

    Pour les extension methods, "c’est un peu déroutant, car il faut absolument faire un using du namespace dans lequel on a mis les méthodes d’extension pour y avoir accès." : c’est pourquoi il est conseillé d’utiliser le même namespace que la classe étendue.

    Vivement le 28 novembre à Paris ! 😀

  4. Philippe A. says:

    Matthieu : il est conseillé d’utiliser le même namespace que la classe étendue !

    >>>

    Oui enfin si tu étend l’ensemble des classes qui implémentent une interface !! ton interface ou IEnumerable etc ….   tu fait comment ?

    Je préfere bien structurer mes packages selon leurs roles dans mon projet.

    Et de toute facon si tu veux utiliser les extension de linq sur beaucoup d’objets du framework, il faut que tu face un using System.Linq;

    ——————————

    Yes pour le 28, y aura t’il beaucoup de nantais, histoire de causer un peu de notre belle région !

  5. Max says:

    Salut Mitsu !

    Où peut on accéder au exemples et aux slides de ta présentation ?

  6. Jano42 says:

    Salut Mitsu !

    J’étais à Lyon le 15 novembre, et ta présentation était vraiment sympa et très enrichissante.

    J’ai été sidéré par ce qu’apporte LinqToSQL par rapport à une utilisation du SQL en chaine de caractères…. (eh oui je suis encore un vieux de la vieille et je code en vc6….)

    Etant donné le gouffre qu’il y a entre ce que je sais faire sur mon environnement de dev et vs2008 avec linq, je n’ai pas pu tout noté… et je te demande où peut-on trouver les exemples et le powerpoint de votre présentation ?

  7. nicop says:

    J’ai assisté à la présentation de LINQ à Paris.

    C’était très enrichissant, super démo de la part de Mitsu. J’ai étais convaincu par LINQ et je regrette de ne pas l’avoir eu 3 ans plus tôt quand on a du  developper un framework maison par dessus ADO.NET pour faire du mapping objet / relationnel.

    Seul gros problème dans le cas de notre entreprise. LINQ TO SQL ne s’utilise actuellement qu’avec SQL Server et il ne faut pas rêver, l’utilisation de LINQ ne justifiera pas un changement de type de base chez nous.

    Donc malheureusement LINQ restera dans un tiroir pour l’instant. Donnez-nous vite des providers pour d’autres bases please please

  8. nicop says:

    Et bravo pour la dernière 1/2h où Mitsu nous a redéveloppé LINQ en live.

    Cela m’a rappellé la fac de math ou on attendait le moment ou le prof de math allait bloquer sur sa démonstration super compliquée et utiliser une anti-sèche l’air de rien.

    Mais non, pas d’anti-sèche pour Mitsu, bravo.

  9. jocelyn payneau says:

    Bonjour,

    J’ai assisté au tour des données à l’espace tete d’or à lyon. J’ai trouvé la présentation sur linqtosql très interessante.

    J’ai une question concernant la connexion à la base.

    Je suis apprenti un BTS d’informatique de gestion.

    Avant lorsque j’utilisais les ADO.net, j’avais une connectionstring, etc. Je me connectais à la base chargeai mon dataset ou faisait un executenonquery() et fermait la connexion et travaillait en mémoire avec le dataset.

    Avec linqtosql, il n’y a plus besoin de gérer la connexion à la base et de vider les objets ou variables utilisées par le linq?

    Merci

    Jocelyn PAYNEAU

  10. Mitsu says:

    Merci de vos retours. J’espère également que nous allons rapidement ouvrir ce provider à d’autres moteurs de base de données.

    La dernière session (Paris) a eu lieu et nous avons enregistré les webcasts.

    Il va nous falloir une dizaine de jours pour TOUT mettre en ligne (webcasts, slides et sources).

    J’annoncerai ça sur mon blog dès que disponible.

    @Jocelin: il y a toujours une connectionstring. Le designer de classes Linq to Sql l’a enregistrée et génère un DataContext typé (NorthwindDataContext) pour lequel on n’a pas besoin de passer la connectionstring. Cela dit, on peut toujours faire: new NorthwindDataContext(connectionString);

  11. jocelyn payneau says:

    Bonsoir,

    Je voudrais savoir si une fois que l’on a fait une requete linq du type :

    var qdom = from dom in cvdc.Domaines

                      select dom;

    Comment pourrait-on récupérer les éléments d’un seul champ par exemple?

    Cela afin de binder sur une combobox.

    Actuelelemnt je fais :

    var domaines = CVHelper.getDomaines();//getDomaines() est la requete ci-dessus

           List<String> lstDomaines = new List<string>();

           foreach (Domaine dom in domaines)

           {

               lstDomaines.Add(dom.description);

           }

           this.cbxDomaine.DataSource = lstDomaines;

           this.cbxDomaine.DataBind();

    Merci

  12. Olivier says:

    @Mitsu :

    Question de clients qui revient souvent et je ne trouve rien de précis : Linq to SQl et Linq to Entites supportent-ils maintenant (vs2008) Oracle ?

    @Jocelyn:

    c’est très facile :

    var qdom = from dom in cvdc.Domaines

              select dom.description;

    tout simplement :-)

  13. mitsu says:

    @Jocelin:

    var qdom = from dom in cvdc.Domaines

              select dom.description;

    this.cbxDomaine.DataSource = qdom;

    this.cbxDomaine.DataBind(); //tu es visiblement en Asp, donc tu peux binder directement la requête à la DataSource. Sinon pour remplir une liste tu peux faire simplement: qdom.ToList().

    @Olivier:

    Linq to Sql ne supporte pas Oracle aujourd’hui.

    Le support d’Entity Data Model pour Oracle est en cours de développement. Nous attendons sa sortie post EDM (mi 2008) sans engagement sur la date dans le sens où ce n’est pas nous qui le développons.

  14. jocelyn payneau says:

    Hello,

    J’ai encore une question mais sur l’insertion cette fois-ci.

    J’ai un formulaire avec des textbox et des combobox.

    Pour les textbox pas de soucis puis que cela correpond à un champ texte dans ma table.

    Mais en fait pour les combobox, cela correspond à une clé étrangère dans ma table.

    Comment procéder?

    1) Lorsque je remplis ma combo, je bind sur le datafieldvalue les id de ma table et ensuite je fais : macléétrangère = this.combobox.selectedvalue

    2) je fais une requête qui me récupère l’id et ensuite je fais comme ci-dessus

    3) linq avec les entityref permet de résoudre cette question

    Merci

    Jocelyn

  15. jocelyn payneau says:

    Je rajoute quelque chose a mon dernier message.

    J’ai remarqué que dans le fichier généré par le mapping il y a des méthodes partielles ajout modification et suppression pour chaque table de la base. Comment fais-on pour les modifier et les appeler?

    Merci

  16. mitsu says:

    Dans une classe partielle de même nom, il faut que tu implémente les méthodes qui ne sont que pour le moment définies dans le code généré. Elles seront alors tout simplement appelées par le code générée au lieu d’être ignorée à la compilation.

    Les webcats ne devraient pas tarder !!

  17. jocelyn payneau says:

    Il faut donc que je crée, par exemple, une classe CV.cs et dedans j’implémente les méthodes générées par le designer?

    Jocelyn

  18. mitsu says:

    Exactement. La classe CV doit être partielle et doit déjà exister (générée par le designer)

  19. jocelyn payneau says:

    Bonsoir,

    Je voudrais savoir comment faire un produit cartésien avec linq. Je n’ai qu’une seule table mots avec 4 mots dedans. En access, je fais cette requête :

    SELECT mots.mot, mots_1.mot, mots_2.mot

    FROM mots, mots AS mots_1, mots AS mots_2

    et j’obtiens ce résultat :

    mots.mot  mots_1.mot  mots_2.mot  mots_3.mot

    bonjour   bonjour     bonjour   bonjour

    mainframe  bonjour bonjour   bonjour

    lan   bonjour bonjour    bonjour

    bobo   bonjour bonjour    bonjour

    Avec SqlServer, j’ai lu que c’est avec CrossJoin que l’on fait un produit cartésien. Mais lorsque je fais db.ExecuteQuery(marequete) je n’ai pas le résultat escompté

    J’aimerai obtenir le meme résultat sous sqlserver que avec access (ci-dessus) et le binder dans mon datagridview.

    En linq, il faut utiliser "join" comme pour une jointure "normale"?

    Je veux essayer de le faire avec sqlserver et linq parce que quand je passe par Access via mon application dot.net si je fais un produit cartésien avec plus de 4 enregistrements ca part dans les choux alors que a vif dans Access je peux faire un produit cartésien avec 20 mots (soit 20^20) en 5s.

    Merci de ton aide

    Jocelyn