Ответ 1
Вы можете использовать Linq для DataTable:
var ids = dt.AsEnumerable().Select(r => r.Field<int>("id")).ToList();
UPDATE: без Linq
List<int> ids = new List<int>(dt.Rows.Count);
foreach(DataRow row in dt.Rows)
ids.Add((int)row["id"]);
Заметьте, что для эффективности лучше использовать row[index]
вместо row[columnName]
. Сначала он получает столбец по индексу из массива столбцов. Latter получает индекс столбца из внутреннего словаря, который сопоставляет имена индексам и только затем получает столбец по индексу.
Еще одна вещь, которую нужно отметить, - инициализировать емкость списка с количеством строк. Если вы этого не сделаете, то внутренний массив списка будет повторно создан и скопирован многократно (зависит от количества строк).
И последнее, что можно сказать - наиболее эффективный способ с огромной таблицей (если это возможно) - фильтровать данные на стороне сервера.