Partager via


GQ08 VII: Linq to Sql mapping

Linq to Sql utilise des informations de mapping pour générer les requêtes Sql.
Comment récupérer ces informations de mapping pour notre propre usage ?

Imaginons un scénario simple pour générer dynamiquement les colonnes d'une grille (en mettant des combos pour les relations par exemple).

 var db = new NorthwindDataContext();
var q =
    from c in db.Customers
    select c;

grid.Columns.Add(...);
grid.Columns.Add(...);
...

grid.ItemsSource = q.ToList();

Comments

  • Anonymous
    August 24, 2008
    PingBack from http://hoursfunnywallpaper.cn/?p=2892

  • Anonymous
    August 25, 2008
    On pourrait envisager quelque chose comme ça : foreach (var p in from prop in typeof(Product).GetProperties()                  where prop.GetCustomAttributes(typeof(ColumnAttribute), true).Any()                  select prop)    dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { HeaderText = p.Name, DataPropertyName = p.Name }); foreach (var p in from prop in typeof(Product).GetProperties()                  where prop.GetCustomAttributes(typeof(AssociationAttribute), true).Any()                  select prop)    dataGridView1.Columns.Add(new DataGridViewComboBoxColumn { HeaderText = p.Name, DataPropertyName = p.Name, DataSource = db.GetTable(p.PropertyType) }); dataGridView1.DataSource = q;

  • Anonymous
    August 25, 2008
    var tableMetaType = db.Mapping.GetTable(typeof(Customer)).MetaType; foreach(var columnMetaData in tableMetaType.DataMembers) {   if(columnMetaData.IsAssociation)   {       grid.Columns.Add(BuildEntityRefColumn(columnMetaData.Name, columnMetaData.Association.OtherType);   }   else   {      grid.Columns.Add(new ScalarColumn(columnMetaData.MappedName, columnMetaData.Name);   } } Un truc dans le genre à priori (pas testé, ni même buildé ^^)

  • Anonymous
    August 25, 2008
    Mathieu, ton code ne fonctionne qu'avec le mapping par attribut :p OUNED !

  • Anonymous
    August 25, 2008
    Voici mon idée: je passe par le TypeDescriptor. On ajoute une méthode MapColumn<T>: var q =    from c in db.Customers    select c; MapColumn(grid,q); grid.ItemsSource = q.ToList();


Et le code de la méthode (au moins la partie intéressante:        private void MapColumn<T>(DataGridView gv, IEnumerable<T> result)        {            PropertyDescriptorCollection propertyCollection = TypeDescriptor.GetProperties(typeof(T));            gv.Columns.Clear();            foreach (PropertyDescriptor prop in propertyCollection)            {                if (prop.PropertyType == typeof(bool))                {                    // A remplir...                }                else if (prop.PropertyType == typeof(DateTime))                {                    // A remplir...                }                else                {                    // A remplir...                }            }        }

  • Anonymous
    August 25, 2008
    The comment has been removed
  • Anonymous
    August 25, 2008
    Petite coquille, remplacez 'MetaType' par 'RowType' dans l'exemple de Simon