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=2892Anonymous
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