【问题标题】:LINQ: Get Table Column NamesLINQ:获取表列名称
【发布时间】:2009-11-26 11:39:30
【问题描述】:

使用 LINQ,如何获取表的列名? C# 3.0、3.5 框架

【问题讨论】:

  • 重新标记为linq-to-sql,如果您指的是其他类型的“LINQ”,请编辑您的问题。
  • 不幸的是,这个查询在 LINQPad 中运行,那么如何在 LINQPad 中获取上下文?

标签: c# .net linq linq-to-sql


【解决方案1】:

也许为时已晚,但我通过这段代码解决了这个问题

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

【讨论】:

  • 谢谢,您为我节省了大量时间。这比接受的答案更好,因为这显示了如何使用 DataContext.Mapping 属性。
  • 对于 VB.Net 使用 GetType(DataContext) 而不是 typeof(DataContext)
【解决方案2】:

下面的代码将返回表格的所有列名

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

【讨论】:

  • 不知道为什么不赞成,这是最优雅的答案。这是等效的 lambda 语法: var columnnames = typeof(table_name).GetProperties().Select(t => t.Name);
  • 也许这没有被赞成,因为您不仅可以获得列,还可以获得其他属性。毕竟,它通常是考虑到可扩展性的部分类。
【解决方案3】:

我假设您的意思是使用 LINQ to SQL,在这种情况下查看 DataContext.Mapping 属性。我就是这么用的。

如果你不是那个意思,也许你可以详细说明你想要达到的目标?

【讨论】:

  • 我想使用 LINQPad (C#) 编写一个程序,它可以为此构建 SQL 插入语句,我需要表的列名。
  • 能否澄清一下...这不是一个答案。
  • 一些示例用法会很棒。 Mapping API 至少可以说有点不直观......
【解决方案4】:

我偶然发现了这个问题,正在寻找同样的东西,但在这里没有看到一个很好的答案。这就是我想出的。直接扔到 C# 表达式模式下的 LINQPad 中即可。

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

根据需要进行修改。

【讨论】:

    【解决方案5】:

    我在 LinqPad 中使用了这段代码

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

    【讨论】:

    • 注意是表名的非复数形式。
    【解决方案6】:

    在您的数据上下文中使用 ExecuteQuery 方法并执行此 SQL 脚本:

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

    这将为您提供一个 IEnumerable&lt;string&gt;,其中包含您指定的该表中的所有列名。

    当然,如果您愿意并且需要,您始终可以从 SQL Server 中的sys.columns 目录视图中检索更多信息(例如数据类型、最大长度)。

    【讨论】:

      【解决方案7】:

      使用反射迭代 L2S 类的属性

      【讨论】:

        【解决方案8】:
                    var query = from x in DataBase.Table_Name
                                select x.Column_Name;
        

        【讨论】:

          【解决方案9】:

          sp_help '表名'

          LinqPad SQL 窗口到 ms sql server 的选项

          【讨论】:

            【解决方案10】:

            在 LinqPad 中:

            TableNames.Take(1) 有效。

            打字速度很快。 (虽然您处于理想世界中,但最好不要选择任何行。)

            注意它是 TableName 的复数形式。您也可以执行 Take(0) 并查看 SQL 结果选项卡。

            【讨论】:

              【解决方案11】:

              我使用的是 .net core 3.0,但这些解决方案都不适合我。我的解决方案是使用 Newtonsoft Json 序列化程序的蛮力方法。

              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

              【讨论】:

              • 这给出了属性名称,而不是表列名称。另外,这个问题不是关于 EF 的,已经有很多答案了,还有类似的问题是关于 EF 的。
              猜你喜欢
              • 1970-01-01
              • 2012-06-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-09-28
              • 2018-12-22
              • 1970-01-01
              • 2014-08-14
              相关资源
              最近更新 更多