21

Using LINQ, how can I get the column names of a table? C# 3.0, 3.5 framework

Alex Bagnolini
  • 21,990
  • 3
  • 41
  • 41
Lennie De Villiers
  • 5,119
  • 7
  • 31
  • 30

11 Answers11

23

Maybe It is too late but, I solved this problem by this code

var db = new DataContex();
var columnNames = db.Mapping.MappingSource
                      .GetModel(typeof(DataContex))
                      .GetMetaType(typeof(_tablename))
                      .DataMembers;
Thymine
  • 8,775
  • 2
  • 35
  • 47
erkan
  • 231
  • 2
  • 2
  • 1
    Thanks, you just saved me a boat load of time. This is better than the accepted answer because this shows how to use the DataContext.Mapping property. – Doctor Jones Jan 30 '13 at 18:09
  • 3
    For VB.Net use `GetType(DataContext)` instead of `typeof(DataContext)`. – Zarepheth Jun 15 '13 at 22:12
15

The below code will worked from returns all the column names of the table

var columnnames = from t in typeof(table_name).GetProperties() select t.Name
bensiu
  • 24,660
  • 56
  • 77
  • 117
ravi kumar
  • 159
  • 1
  • 3
  • 2
    Not sure why this was not upvoted, it is the most elegant answer. Here is the lambda syntax equivalent: var columnnames = typeof(table_name).GetProperties().Select(t => t.Name); – draconis Jan 28 '13 at 13:40
  • 3
    Maybe this wasn't upvoted as you don't only get the columns but additional properties as well. It's usually a partial class with extensibility in mind after all. – mbx Feb 03 '14 at 08:00
7

I stumbled upon this question looking for the same thing and didn't see a really good answer here. This is what I came up with. Just throw it into LINQPad under C# expression mode.

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

Modify as you see fit.

Marty Neal
  • 8,741
  • 3
  • 33
  • 38
6

I assume you mean by using LINQ to SQL, in which case look at the DataContext.Mapping property. That's what I use.

If you don't mean that, perhaps you can elaborate on what you are trying to achieve?

RichardOD
  • 28,883
  • 9
  • 61
  • 81
2

Use the ExecuteQuery method on your data context and execute this SQL script:

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

This gives you an IEnumerable<string> with all the column names in that table you specified.

Of course, if you want and need to, you could always retrieve more information (e.g. data type, max length) from the sys.columns catalog view in SQL Server.

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
2

I used this code in LinqPad

from t in typeof(table_name).GetFields() select t.Name
Don
  • 477
  • 4
  • 5
0
            var query = from x in DataBase.Table_Name
                        select x.Column_Name;
William
  • 491
  • 5
  • 9
0

Iterate the properties of your L2S classes with reflection

Matt Kocaj
  • 11,278
  • 6
  • 51
  • 79
0

sp_help 'TableName'

An option for a LinqPad SQL window to ms sql server

Curtis Yallop
  • 6,696
  • 3
  • 46
  • 36
0

In LinqPad:

TableNames.Take(1) works.

It is fast to type. (Although you in an ideal world, it would be nicer to not select any rows.)

Note it is the pluralized form of TableName. You can also do Take(0) and look at the SQL results tab.

Curtis Yallop
  • 6,696
  • 3
  • 46
  • 36
-1

I am using .net core 3.0 and none of these solutions worked for me. My solution was a brute forced approach using Newtonsoft Json serializer.

var dt = this._context.Prodmats.First();  // get the first row of my table

var json = JsonConvert.SerializeObject(dt);  
 
var tva2 = new string(json.Where(c => char.IsLetter(c) || char.IsDigit(c) || c == ':' 
                        || c == ',' || char.IsWhiteSpace(c) ).ToArray())  ;

        var  arr = tva2.Split(',');

        var col = new List<string>();

        foreach (var val in arr)
        { 
          var ch = val.Split(':');
           
          var trimCh = ch[0];               
          col.Add(trimCh.Trim());
        }

// col <= has the columns list

Julian Shaw
  • 1,011
  • 8
  • 5
  • This gives property names, not table column names. Also, the question is not about EF, already has many answers, and there are similar questions that are about EF. – Gert Arnold Jan 02 '21 at 15:17