2009-11-26 17 views
16

Utilizzando LINQ, come posso ottenere i nomi delle colonne di una tabella? C# 3.0, 3.5 quadroLINQ: ottenere i nomi delle colonne della tabella

+0

Ricomposto a 'linq-to-sql', modificare la domanda se si intende un altro tipo di" LINQ ". –

+0

Sfortunatamente questa query viene eseguita all'interno di LINQPad, quindi come faccio a ottenere il contesto in LINQPad? –

risposta

5

Presumo si intende utilizzando LINQ to SQL, in cui guardare caso presso la struttura DataContext.Mapping. Questo è quello che uso.

Se non vuoi dire questo, forse puoi approfondire quello che stai cercando di ottenere?

+0

Voglio scrivere un programma usando LINQPad (C#) Che può creare istruzioni di inserimento SQL fuori rotta per questo ho bisogno dei nomi delle colonne delle tabelle. –

+5

potrebbe essere chiarito un po '... questa non è una grande risposta. –

+1

Alcuni esempi di utilizzo sarebbero grandiosi. L'API di mappatura è un po 'poco intuitiva, per non dire altro ... –

0

Iterate le proprietà delle classi L2S con la riflessione

2

utilizzare il metodo ExecuteQuery sul contesto dati ed eseguire questo script SQL:

var columnNames = ctx.ExecuteQuery<string> 
    ("SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('your table name');"); 

Questo vi dà l'IEnumerable<string> con tutti i nomi delle colonne in quella tabella specificati.

Ovviamente, se si desidera e necessario, è sempre possibile recuperare ulteriori informazioni (ad esempio tipo di dati, lunghezza massima) dalla vista del catalogo sys.columns in SQL Server.

0

Se si sta parlando di ottenere le colonne per una tabella associata, vedere this answer per vedere come ottenere gli attributi della colonna. Da lì è possibile ottenere i nomi delle colonne, i tipi, ecc.

6

Mi sono imbattuto in questa domanda cercando la stessa cosa e non ho visto una risposta veramente buona qui. Questo è quello che mi è venuto in mente. Basta lanciarlo in LINQPad in modalità di espressione C#.

from t in typeof(UserQuery).GetProperties() 
where t.Name == "Customers" 
from c in t.GetValue(this,null).GetType().GetGenericArguments()[0].GetFields() 
select c.Name 

Modificare come si desidera.

17

forse è troppo tardi, ma, ho risolto questo problema da questo codice

var db = new DataContex(); 
var columnNames = db.Mapping.MappingSource 
         .GetModel(typeof(DataContex)) 
         .GetMetaType(typeof(_tablename)) 
         .DataMembers; 
+1

Grazie, mi hai appena salvato un carico di tempo. Questo è migliore della risposta accettata perché mostra come utilizzare la proprietà DataContext.Mapping. –

+3

Per VB.Net utilizzare 'GetType (DataContext)' invece di 'typeof (DataContext)'. – Zarepheth

2

Ho usato questo codice in LINQPad

from t in typeof(table_name).GetFields() select t.Name 
+0

Si noti che è la versione non pluralizzata del nome della tabella. –

15

Il codice qui sotto vi lavorò dal restituisce tutti i nomi delle colonne di tavolo

var columnnames = from t in typeof(table_name).GetProperties() select t.Name 
+2

Non sono sicuro del motivo per cui questo non è stato pubblicizzato, è la risposta più elegante. Ecco l'equivalente della sintassi lambda: var columnnames = typeof (nome_tabella) .GetProperties(). Select (t => t.Name); – draconis

+0

Forse questo non è stato svitato dato che non solo ottieni le colonne ma anche proprietà aggiuntive. Di solito è una classe parziale con in mente l'estensibilità. – mbx

0
  var query = from x in DataBase.Table_Name 
         select x.Column_Name; 
0

sp_help 'TableName'

Un'opzione per una finestra LINQPad SQL per MS SQL server

0

In LINQPad:

TableNames.Take (1) funziona.

È veloce da digitare. (Anche se sei in un mondo ideale, sarebbe meglio non selezionare alcuna riga.)

Nota è la forma pluralizzata di TableName. Puoi anche fare Take (0) e guardare la scheda dei risultati SQL.

Problemi correlati