计算整数时 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不够熟悉,不知道要更改什么以允许它计算十进制值的实例。

如何使此语句更健壮,使其适用于指示列中包含的任何数据类型?

计算整数时 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()
            };