SteveHolle Ответов: 1

Возвращает максимальную ширину столбца datatable для всех строк.


Я выполняю этот оператор SQL с помощью метода sqlclient:
select top 10 *
   from wlo_104466_CustomerPriceFile
   order by [UPC Code]
Что, кажется, работает правильно.

Однако, когда я получаю максимальную ширину для каждого столбца, используя следующий код:
List<int> maximumLengthForColumns = 
    Enumerable.Range(0, dataTable.Columns.Count)
    .Select(col => dataTable.AsEnumerable()
        .Select(row => row[col]).OfType<string>()
        .Max(val => val.Length)).ToList();
Я получаю исключение: "последовательность не содержит элементов.

Однако я могу запустить следующий код на тех же датируемых результатах запроса:
foreach(DataRow row in dataTable.Rows)
{
  foreach(var item in row.ItemArray)
  {
    Console.Write(item + ",");
  }
  Console.WriteLine();
}
Я могу выписать каждую строку, поле за полем.

Следующий запрос, который исключает ограничение" топ-10", но в остальном является той же таблицей:
select *
   from wlo_104466_CustomerPriceFile
   order by [UPC Code]
Отлично генерирует список maximumLengthForColumns.

Это данные, сгенерированные при выполнении первого запроса в среде Microsoft SQL Server Management Studio:
UPC Code         Supplier Code Part No       Pack Qty        Unit of Measure
---------------- ------------- ------------- --------------- ---------------
NULL             HOB           S228519T-P01  14              CTN
NULL             LIN           ED031252      4SRP            CTN
NULL             LIN           ED031253      3.3SRP          CTN
NULL             LIN           ED031267      10.3CT          CTN
NULL             LIN           ED031269      11.9CT          CTN
NULL             LIN           ED031271      10.3CT          CTN
NULL             LIN           ED031288      3.7TB           CTN
NULL             LIN           ED031289      4.6TB           CTN
NULL             LIN           ED031290      3.5TB           CTN
NULL             LIN           ED031291      3.7TB           CTN

(10 row(s) affected)
Мне нравится использовать чистый внешний вид кода Linq, и я хотел бы понять, что я делаю неправильно.

Спасибо за помощь.

Что я уже пробовал:

1) итерация через datatable с использованием цикла foreach, который, казалось, работал.
2) при трассировке через процедуру maximumLengthForColumns я заметил, что строка выполнения никогда не проходит мимо строки ".Select(row..." в запросе, который вызывает исключение, но опускается до строки ".Max(val..." в запросе, который это делает.

НОВЫЙ
Я попробовал использовать другую таблицу со всеми нулями в первом столбце:
C1         C2         C3         C4         C5
---------- ---------- ---------- ---------- ----------
NULL       1C2        1C3        1C4        1C5
NULL       2C2        2C3        2C4        2C5
NULL       3C2        3C3        3C4        3C5
NULL       4C2        4C3        4C4        4C5
NULL       5C2        5C3        5C4        5C5
NULL       6C2        6C3        6C4        6C5
NULL       7C2        7C3        7C4        7C5
NULL       8C2        8C3        8C4        8C5
NULL       9C2        9C3        9C4        9C5

и запрос максимальной ширины не удался.

Затем я добавил 9 строк со всеми нулями во втором столбце:
C2         C3         C4         C5
---------- ---------- ---------- ---------- ----------
NULL       1C2        1C3        1C4        1C5
NULL       2C2        2C3        2C4        2C5
NULL       3C2        3C3        3C4        3C5
NULL       4C2        4C3        4C4        4C5
NULL       5C2        5C3        5C4        5C5
NULL       6C2        6C3        6C4        6C5
NULL       7C2        7C3        7C4        7C5
NULL       8C2        8C3        8C4        8C5
NULL       9C2        9C3        9C4        9C5

и функция max преуспела, но она, казалось, проверяла только строки без нуля в первом столбце.

Затем я попробовал все нули во втором столбце:
C2         C3         C4         C5
---------- ---------- ---------- ---------- ----------
1C1        NULL       1C3        1C4        1C5
2C1        NULL       2C3        2C4        2C5
3C1        NULL       3C3        3C4        3C5
4C1        NULL       4C3        4C4        4C5
5C1        NULL       5C3        5C4        5C5
6C1        NULL       6C3        6C4        6C5
7C1        NULL       7C3        7C4        7C5
8C1        NULL       8C3        8C4        8C5
9C1        NULL       9C3        9C4        9C5
и функция не сработала.

lw@zi

Вы ищете максимально допустимую длину в каждом столбце или данные с максимальной длиной для столбца в таблице?

SteveHolle

Я ищу максимальную длину в каждом столбце для целей отображения.

1 Ответов

Рейтинг:
10

SteveHolle

Я нашел свою проблему. "OfType & lt;string>" вызывал пропуск строк с нулем в первых столбцах (возможно, и в других столбцах). Убрал его и все хорошо.