51 messaggi dal 16 gennaio 2009
Buongiorno a tutti
Avrei la necessità di reperire i nomi delle colonne di una tabella utilizzando Linq to Entities o Linq to Sql, ho cercato in rete ed ho visto da più parti che spesso si fa riferimento alla classe DataContext ma, data anche la mia scarsa esperienza con LINQ, non sono riuscito ad implementarla.
Qualcuno può darmi una mano a capire?
Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
Linq to Sql e Linq to Entities non sono le tecnologie più adatte quando hai a che fare con tabelle di cui il nome e il numero di colonne non è noto.

Infatti, entrambe si rivelano utili quando vuoi lavorare con delle classi che hai scritto in C# o VB.NET e vuoi che le loro proprietà si riempiano con i valori letti da altrettante colonne di una tabella del database (di cui devi conoscere i nomi).

Per ottenere l'elenco delle colonne, potresti usare il metodo GetSchemaTable() dei DataReader. Vedi un esempio qui:
https://msdn.microsoft.com/it-it/library/system.data.datatablereader.getschematable(v=vs.110).aspx

Comunque, spiega bene perché hai "la necessità" di usare Linq to Entites o Linq to Sql. Se in questo momento uno vale l'altro, immagino che lo sviluppo del progetto non sia ancora iniziato.
Spiega più approfonditamente il tuo scenario e parla un po' di come poi userai i nomi delle colonne che hai ottenuto.

ciao,
Moreno

Enjoy learning and just keep making
51 messaggi dal 16 gennaio 2009
Ciao Moreno, intanto grazie per la risposta.
Uso Linq semplicemente perchè ho già fatto un'applicazione con questa tecnologia e l'ho trovata semplice anche per uno come me che non "mastica" database tutti i giorni.
La necessità di conoscere le colonne nasce dal fatto che ho diverse tabelle che contengono dati di apparecchiature (stiamo parlando di una applicazione in ambito industriale) e, in base al tipo di apparecchiatura e di alcune preferenze descritte in un file di setup, vorrei fare delle maschere di immissione e visualizzazione personalizzate.
Mi spiego meglio:
La tabella A contiene i dati dell'apparecchiatura A
La tabella B contiene i dati dell'apparecchiatura B
....
La tabella n contiene i dati dell'apparecchiatura n
Semplicemente vorrei utilizzare un solo form costruito dinamicamente in base alla tabella interessata.
Dimenticavo: l'applicativo è scritto in VB.net.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
ok, ora è chiaro.

Tieni presente che, se scegli di usare Linq to Entities (cioè Entity Framework), è perché vuoi costruirti delle classi di entità per sfruttare i vantaggi della programmazione orientata agli oggetti.

In quest'ottica, le tabelle che hai nel database diventano di importanza secondaria e, infatti, per inviare query usi LINQ To Entities nei confronti del tuo modello, e non più il linguaggio SQL nei confronti delle tabelle.

Di conseguenza, anche per riuscire a creare delle maschere dinamicamente, dovresti guardare alle proprietà delle tue classi, e non alle colonne delle tabelle.
Poco importa se in questo momento classi e tabelle sono le une immagini delle altre. In futuro, quando acquisirai maggiore esperienza di Entity Framework, potresti voler fare delle modifiche al mapping che faranno divergere classi e tabelle.

Quindi, quello che dovresti fare è usare la reflection per ottenere l'elenco di proprietà di una classe. Facendo così puoi anche porre degli attributi sulle proprietà per creare maschere più precise (es. che supportino la validazione dei dati inseriti). Ecco una breve introduzione:
http://www.mrwebmaster.it/csharp/introduzione-reflection_7472.html

Per esempio, questo sistema è anche usato da ASP.NET MVC con il metodo Html.EditorForModel per creare automaticamente un form di modifica che rifletta le proprietà della classe.

Tu che tipo di applicazione stai scrivendo? Web o Windows?

ciao,
Moreno

Enjoy learning and just keep making
51 messaggi dal 16 gennaio 2009
Ciao Moreno,
si certo, il fatto che con l'entity framework in realtà io agisco con uno strato di classi che rispecchiano le tabelle mi è chiaro, è il fondamento del sistema. Il fatto di far divergere le classi dalle tabelle lo è un po' di meno ma, come anche tu hai detto, non è il mio problema attuale.
Sospettavo che si dovesse tirare in ballo la reflection e ti ringrazio del link perchè è un argomento sul quale sono un po' digiuno, comincerò a studiarci su.
Comunque se hai qualche altro link utile sarà bene accetto.
La mia applicazione sarà per Windows, almeno per adesso...

Grazie
Ciao
Sandro
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Sandro,


Comunque se hai qualche altro link utile sarà bene accetto.

Sì, guarda questo esempio che sfrutta la reflection: ti permette di ottenere l'elenco di tutte le proprietà pubbliche di una classe che possono essere scritte (cioè che possiedono un setter).

http://stackoverflow.com/questions/302476/how-do-you-find-only-properties-that-have-both-a-getter-and-setter#answer-405739

Così sei libero di impostare un setter privato per alcune proprietà, in modo che non compaiano nelle maschere. L'ID, l'eventuale data e autore dell'ultima modifica sono cose che - credo - non vorrai rendere modificabili dalle maschere.

ciao,
Moreno
Modificato da BrightSoul il 09 settembre 2016 22.13 -

Enjoy learning and just keep making
51 messaggi dal 16 gennaio 2009
Buongiorno Moreno,
ok, adesso ci studio un po' su e vediamo cosa succede.
Grazie ancora,
Sandro

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.