2009-11-26 2 views
16

Используя LINQ, как я могу получить имена столбцов таблицы? C# 3,0, 3,5 рамкиLINQ: Получить имена столбцов таблицы

+0

Перемещенный в 'linq-to-sql', пожалуйста, отредактируйте свой вопрос, если вы имели в виду какой-то другой тип« LINQ ». –

+0

К сожалению, этот запрос выполняется внутри LINQPad, так как я могу получить контекст в LINQPad? –

ответ

5

Я предполагаю, что вы имеете в виду с помощью LINQ к SQL, в этом случае смотреть на DataContext.Mapping собственности. Это то, что я использую.

Если вы не имеете в виду это, возможно, вы можете уточнить, чего вы пытаетесь достичь?

+0

Я хочу написать программу, использующую LINQPad (C#), которая может строить инструкции вставки SQL без курса для этого. Мне нужны имена столбцов таблиц. –

+5

это может быть выяснено немного ... это не очень большой ответ. –

+1

Пример использования примера будет замечательным. API сопоставления немного неинтуитивно, если не сказать больше ... –

0

итерацию свойства ваших классов L2S с отражением

2

Используйте метод ExecuteQuery от контекста данных и выполнить этот SQL скрипт:

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

Это дает вам IEnumerable<string> со всеми именами столбцов в этой таблице вы указали.

Конечно, если вам нужно и нужно, вы всегда можете получить дополнительную информацию (например, тип данных, максимальную длину) из каталога каталога sys.columns в SQL Server.

0

Если вы говорите о получении столбцов для сопоставленной таблицы, см. this answer, чтобы узнать, как добраться до атрибутов столбца. Оттуда вы можете получить названия колонок, типы и т. Д.

6

Я наткнулся на этот вопрос, ища то же самое, и не увидел здесь действительно хорошего ответа. Это то, что я придумал. Просто бросьте его в LINQPad в режиме выражения 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 

Изменить как вы сочтете это подходящим.

17

Может быть, это слишком поздно, но я решил эту проблему с помощью этого кода

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

Спасибо, вы только что спасли мне лодку. Это лучше, чем принятый ответ, потому что это показывает, как использовать свойство DataContext.Mapping. –

+3

Для VB.Net используйте 'GetType (DataContext)' вместо 'typeof (DataContext)'. – Zarepheth

2

Я использовал этот код в LINQPad

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

Обратите внимание, что это unpluralized версия имени таблицы. –

15

Ниже код работал с возвращает все имена столбцов таблица

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

Не уверен, почему это не было поддержано, это самый элегантный ответ. Вот эквивалент лямбда-синтаксиса: var columnnames = typeof (table_name) .GetProperties(). Выберите (t => t.Name); – draconis

+0

Возможно, это не было поддержано, поскольку вы получаете не только столбцы, но и дополнительные свойства. В конце концов, это, как правило, частичный класс с расширяемостью. – mbx

0

sp_help 'TableName'

Опция для окна LINQPad SQL в MS SQL Server

0

В LINQPad:

TableNames.Take (1) работает.

Быстро напечатать. (Хотя вы в идеальном мире, было бы лучше не выбирать любые строки.)

Обратите внимание, что это плюрализованная форма TableName. Вы также можете сделать Take (0) и посмотреть вкладку результатов SQL.

Смежные вопросы