计算整数时 LINQ 查询失败
本文关键字:查询 失败 LINQ 整数 计算 | 更新日期: 2023-09-27 18:30:30
我有以下查询,它采用DataTable
并计算值在countField
列中出现的次数。
var countField = "class"
var query = from row in myDataTable.AsEnumerable()
group row by row.Field<string>(countField)
into sumry
orderby sumry.Count() descending
select new
{
Text = sumry.Key,
CountofRows = sumry.Count()
};
这将按预期工作,除非列包含十进制值。我对linq
不够熟悉,不知道要更改什么以允许它计算十进制值的实例。
如何使此语句更健壮,使其适用于指示列中包含的任何数据类型?
您可以使用
索引器获取值并将其转换为DataRow's
string
:
var query = from row in myDataTable.AsEnumerable()
group row by row[countField].ToString()
into sumry
orderby sumry.Count() descending
select new
{
Text = sumry.Key,
CountofRows = sumry.Count()
};
对于所有类型,这应该按预期工作。
您可以获取列的类型并使用反射来调用Field<T>()
。 (有关调用泛型方法,请参阅此答案:https://stackoverflow.com/a/232621/409259)
var columnType = myDataTable.Columns[countField].DataType;
var method = typeof(DataRowExtensions).GetMethod("Field", new Type[] { typeof(DataRow), typeof(string) });
var generic = method.MakeGenericMethod(columnType);
var query = from row in myDataTable.AsEnumerable()
group row by generic.Invoke(null, new object[] { row, countField })
into sumry
orderby sumry.Count() descending
select new
{
Text = sumry.Key,
CountOfRows = sumry.Count()
};