如何使用Linq从DataTable获取列名

yhuiod9q  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(161)

我尝试在DataTable上使用LINQ,DataTable从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并将其发送到网页。

hm2xizp9

hm2xizp91#

要获取列名:

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

qnakjoqk2#

The problem is Select() is projecting the objects into a new form. You are seeing 2018 because of '=' instead of '=='. You need to use Where()

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

You will still end up with a list of DataRows though. The DataTable object isn't really what you should be using because it already provides a nice way to filter its rows:

myTable.Rows.Find(2018);

If you are trying to convert it to a list of objects you should use the Select() method something like:

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

niknxzdl3#

您可以创建以下函数:

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)

相关问题