我正在尝试在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并将其发送到网页。
答案 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);
我希望这会对您有所帮助。
答案 2 :(得分:0)
要获取列名:
myTable.Columns.Cast<DataColumn>().Select(dc =>dc.ColumnName).ToList();