如何使用Linq从DataTable获取列名

时间:2019-02-13 17:51:55

标签: c# asp.net linq

我正在尝试在DataTable上使用LINQ,这是从sql获取数据的。因此,我有一个数据表,其中包含通常的列和行,并且看起来与sql select语句完全一样。现在,我需要从该数据中获取某些行和列(包括列名)。

我使用AsEnumerable将数据表转换为LINQ可以使用的表,但是我不确定它到底能做什么。是否会将数据转换为对象数组,每行成为一个对象?

我曾经使用过Javascript,并且它是更新的箭头功能,所以我想将Linq与lambda结合使用以保持一致。

我正在尝试获取第一列的值等于2018的行和列名称

DataTable myTable = getData(); // populates the datatable and I've verified the data
 var linqTable = myTable.AsEnumerable().Select( x => x[0] = 2018);

我需要获取行和列的名称。例如,像一个对象或对象数组。但是,上面的代码不会返回数据或列名,而只会返回其中带有2018年的两行。

我的目标是最终将此数据序列化为json并将其发送到网页。

3 个答案:

答案 0 :(得分:2)

问题是Select()将对象投影到新表单中。您看到的是2018年,原因是使用'='而不是'=='。您需要使用Where()

 var linqTable = myTable.AsEnumerable().Where( x => x.Field<int>(0) == 2018);

尽管如此,您仍将获得一个DataRows列表。 DataTable对象并不是您真正应该使用的对象,因为它已经提供了一种过滤其行的好方法:

myTable.Rows.Find(2018);

如果您尝试将其转换为对象列表,则应使用Select()方法,例如:

var linqTable = myTable.AsEnumerable().Where(x => x.Field<int>(0) == 2018)
            .Select(x => new
            {
                year = x[0],
                p1 = x[1],
                p2 = x[2] // etc...
            });

答案 1 :(得分:0)

您可以创建以下功能:

public static DataTable CreateDataTableFromAnyCollection<T>(IEnumerable<T> list)
    {
        Type type = typeof(T);
        var properties = type.GetProperties();

        DataTable dataTable = new DataTable();
        foreach (PropertyInfo info in properties)
        {
            dataTable.Columns.Add(new DataColumn(info.Name, Nullable.GetUnderlyingType(info.PropertyType) ?? info.PropertyType));
        }

        foreach (T entity in list)
        {
            object[] values = new object[properties.Length];
            for (int i = 0; i < properties.Length; i++)
            {
                values[i] = properties[i].GetValue(entity,null);
            }

            dataTable.Rows.Add(values);
        }

        return dataTable;
    }

并传递LINQ查询返回的任何类型的对象。

DataTable dt = CreateDataTableFromAnyCollection(query);

我希望这会对您有所帮助。

Creating a DataTable From a Query (LINQ to DataSet)

答案 2 :(得分:0)

要获取列名:

myTable.Columns.Cast<DataColumn>().Select(dc =>dc.ColumnName).ToList();