[C#]在 DataTable 对象,如何可以得到列和它们的最小/最大字符串的列表。长度吗?

标签: Linq SQLServer C#
发布时间: 2017/2/27 3:26:12
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我得到一个字符串截断误差时,我尝试 SqlBulkCopy 和我需要调试哪个字段造成它的。

我对这点为止。 我可以得到的列名称,但不知道如何继续得到其最小/最大 string.length。

var columnNames = from columns in table.Columns.Cast<DataColumn>()
                  select columns.ColumnName;

我不知道它是否可能与 LINQ。 如果不是,我对这中倾倒的 SQL 服务器开放并执行那里的分析太。

解决方法 1:

若要获取列中存储的最长字符串的长度,这样的事情应该工作︰

var columns = 
    from DataColumn column in table.Columns
    where column.DataType == typeof(string)
    select new
    {
        column.ColumnName,
        MaxLength = 
        (
            from DataRow row in table.Rows 
            where !row.IsNull(column) 
            select ((string)row[column]).Length
        ).Max()
    };

或者,在 lambda 语法︰

var columns = table.Columns.Cast<DataColumn>()
    .Where(column => column.DataType == typeof(string))
    .Select(column => new 
    { 
        column.ColumnName, 
        MaxLength = table.Rows.Cast<DataRow>()
            .Where(row => !row.IsNull(column))
            .Select(row => ((string)row[column]).Length)
            .Max() 
    });

编辑︰你也可以开始用行和枚举列对于每一行,在一张大桌子,可能会给你更好的性能︰

var columns =
    from DataRow row in table.Rows
    from DataColumn column in table.Columns
    where column.DataType == typeof(string) && !row.IsNull(column)
    let length = ((string)row[column]).Length
    group length by column.ColumnName into g
    select new
    {
        ColumnName = g.Key,
        MaxLength = g.Max()
    };

在 lambda 语法︰

var columns = table.Rows.Cast<DataRow>()
    .SelectMany(row => table.Columns.Cast<DataColumn>(), (row, column) => new { row, column })
    .Where(pair => pair.column.DataType == typeof(string) && !pair.row.IsNull(pair.column))
    .GroupBy(pair => pair.column.ColumnName, (key, items) => new 
    { 
        ColumnName = key, 
        MaxLength = items.Max(x => ((string)x.row[x.column]).Length) 
    });
官方微信
官方QQ群
31647020