从EnumerableRowCollection <t> LINQ结果</t>获取“列标题”

时间:2011-10-27 10:42:35

标签: c# .net linq datatable ienumerable

希望这相对简单。在LINQ上执行DataTable查询后,我想将结果放入我计划动态创建的另一个DataTable中。我需要的是在column titles查询结果集合中找到LINQ的名称。

编辑:LINQ查询

var results= from a in dt.AsEnumerable()
                    where a.Field<int>("ID") == i 
                    select new 
                    {
                       ID = a.Field<int>("ID"),
                       a = a.Field<double>("A"),
                       b = a.Field<double>("B")
                    };

我基本上试图返回 - “ID”,“a”和“b”。

真的希望有道理!

2 个答案:

答案 0 :(得分:1)

由于查询结果集是一组匿名类型项,因此无法对DataTable和DataColumn / Rows执行任何操作...但您可以使用反射检索名称,因为每列都将表示为匿名类型的公共属性:

IEnumerable<string> names = results.First()
                                   .GetType()
                                   .GetProperties()
                                   .Select(p => p.Name);

这将返回:

[0]: "ID"
[1]: "a"
[2]: "b"

答案 1 :(得分:0)

作为一个快速的爆破(可能不是最好的,但这是匆忙做的 - 匆忙!!):

    Dim _dt As New DataTable
    Dim _col1 As New DataColumn("ClientID", GetType(Integer))
    Dim _col2 As New DataColumn("ClientName", GetType(String))

    _dt.Columns.Add(_col1)
    _dt.Columns.Add(_col2)

    _dt.Rows.Add(1, "John")
    _dt.Rows.Add(2, "Shaun")

    Dim _query = From dt In _dt

    Dim _colName As New List(Of String)

    For Each _q In _query
        For Each _column In _q.Table.Columns
            _colName.Add(_column.ToString)
        Next
    Next

或者,如果您已经有了linq查询,请将其转换回数据表,然后获取列:

    Dim _dt1 = _query.CopyToDataTable

    For Each _column In _dt1.Columns
        _colName.Add(_column.ToString)
    Next

希望这是有道理的