none
join à l'intérieur d'une meme table RRS feed

  • Question

  • Bonjour,

     

    Dans la suite du poste suivant: http://social.msdn.microsoft.com/Forums/fr-FR/aspnetfr/thread/40a21c8c-13d5-4cab-9f9e-ec740c0518e1

     

    J'ai créer ma db qui se présente ainsi:

    id (int)

    parent (int, nullable)

    position(int)

    titre(nvarchar(50))

    description(nvarchar(50))

     

    Puis j'ai créer un model linq to sql et enfin le code suivant:

     

    public ViewResult Index()
     {
     var db = new NavigationModelDataContext();
     var r = (from s in db.sys_navigations
     select s).ToList();
    
     return View(r);
     }
    

     

    Je souhaiterais dans mes vues que la position reste un int, ca c'est une chose, mais que le parent ce soit le titre d'un précédent lien.

    Exemple:

    Articles

       Informatique

     

    Informatique à pour parent le lien Articles. à la place d'avoir un int, je veux que la colonne (dans l'index, et une listebox dans create et edit) soit le titre du parent (il est nullable, donc si il a pas de parent c'est le cas de Article, si il a un parent, c'est le cas d'informatique)

    Comme c'est à l'intérieur de la meme db je ne vois pas comment "faire un join". à moin de devoir créer une seconde requête ou j'sais pas quoi.

    Avez-vous une idée pour corriger ce problème sans changer la structure de ma db?

     

    Meilleures salutations

     

    Edit: J'ai essayé une sorte d'expression régulière mais c'est pas encore top:

     

     

    var db = new NavigationModelDataContext();
     var r = (from s in db.sys_navigations
      orderby s.position
      select new
      {
      parent = from x in db.sys_navigations join a in db.sys_navigations on x.id equals a.parent select x.titre,
      position = s.position,
      titre = s.titre,
      description = s.description
      }).ToList();
    
     return View(r);

     

     

    Edit: Avec l'aide d'un membre de developpez.com nous avons été au stade suivant:

        public ViewResult Index()
        {
          var db = new NavigationModelDataContext();
     
          var parents = from s in db.sys_navigations
                 from p in db.sys_navigations
                 where s.parent != null && s.parent == p.id
                 select new 
                 {
                   s, 
                   p.titre
                 };
    
          var r = (from s in db.sys_navigations
               from p in parents
               where s == p.s
               orderby s.position
               select new
               {
                 parent = p.titre,
                 position = s.position,
                 titre = s.titre,
                 description = s.description
               }).ToList();
     
          return View(r);
        }

    avec l'erreur suivante:

    "

    L'élément de modèle passé dans le dictionnaire est de type 'System.Collections.Generic.List`1[<>f__AnonymousType3`4[System.String,System.Int32,System.String,System.String]]', mais ce dictionnaire requiert un élément de modèle de type 'System.Collections.Generic.IEnumerable`1[CobaltCMS.Models.sys_navigation]'."

     

    mercredi 9 mars 2011 23:15

Toutes les réponses

  • Bonjours

    Es ce que vous voulez faire une self join comme cet exemple

    using System;
    using System.Linq;
    namespace MSDN
    
    {
      class Program
      {
        static int [] liste = new int[] {1,2,3,4,5,6,7,8,9,10 };
        static void Main(string[] args)
        {
          var query = from el in liste
                join el2 in liste on el equals el2 / 2
                select el;
          Console.ReadLine();
        }
    
      }
    }
    
    


    The complexity resides in the simplicity Follow me at: http://smartssolutions.blogspot.com
    mardi 24 mai 2011 21:35