【发布时间】:2012-11-25 23:53:57
【问题描述】:
我想使用 Linq 通过 ColumnName 动态选择 DataTable 列,但要使用 Field 我必须显式地将它们强制转换或将所有内容装箱到一个对象中,这效率不高。
我试过了:
string[] colsNames = new[] { "Colum1", "Colum2" };
DataTable dt = StoredProcedure().Tables[0];
var cols = dt.Columns.Cast<DataColumn>().Where(c => cols.Contains(c.ColumnName));
if (cols.Any())
{
dt.AsEnumerable().Select(r => string.Join(":", cols.Select(c => r.Field<c.DataType>(c.ColumnName))))
}
但这会给我一个错误The type or namespace name 'c' could not be found
例如,如何将typeof(decimal) 转换为Field<decimal>("Column1")?
【问题讨论】:
-
有什么意义?如果您不知道请求数据的类型,那么您只能处理
object -
我知道请求数据的类型
-
但是你说你是按列名检索数据.. 那么
IEnumerable<known_type> requestedData = dt.AsEnumerable().Select(r => r.Field<known_type>("ColumnName"))有什么问题呢? -
@lazyberezovsky 因为我正在动态选择列。
-
那你不知道请求数据的类型
标签: c# linq reflection casting