Linq Исключая столбец

Вопрос:

Все. У меня возникла небольшая проблема, пытаясь исключить столбец из запроса Linq. То, что я пытаюсь сделать, — найти все строки, в которых есть хотя бы один из столбцов, за исключением столбца идентификатора. В столбце ID устанавливается значение Auto increment, поэтому он всегда будет иметь данные. Как правило, таблица данных загружается из другого хранилища данных (например, Excel, Access, CSV и т.д.), И иногда некоторые из этих строк не содержат данных. Моя текущая работа заключается в том, чтобы удалить эту колонку ID из таблицы данных (dt1), а затем добавить ее обратно в таблицу данных и повторно заполнить столбец. Примечание. Общее количество столбцов может варьироваться от 10 до 100, поэтому любое решение должно быть динамическим.

В моем примере ниже только строки с 1 по 4 содержат данные во всех столбцах, где строки 0 и 5 содержат только данные в столбце ID. В dt2 мне нужны только строки с 1 по 4. Итак, мой вопрос: как я могу удалить идентификационную колонку из моего запроса LINQ ниже?

Спасибо за любые конструктивные предложения заранее!

private void LoadDataTable()
{
DataTable dt1 = new DataTable();

//Create three columns
DataColumn dc = new DataColumn("ID", typeof(Int32));
dc.AutoIncrement = true;
dc.AllowDBNull = false;
dc.AutoIncrementSeed = 1;
dt1.Columns.Add(dc);
dc.SetOrdinal(0);

dc = new DataColumn("Item", typeof(String));
dt1.Columns.Add(dc);

dc = new DataColumn("Quantity", typeof(Int32));
dt1.Columns.Add(dc);

//Create items Array
string[] items = new string[] { "Ford", "Chevy", "GMC", "Buick", "Toyota", "Honda", "Mercury"
,"Hyundai", "Rolls Royce", "BMW", "Mercedes Benz", "Bentley", "Porche"
,"Infinity", "Jaguar" };

//Load Dummy data
Random rnd = new Random();
for (int i = 0; i < 5; i++)
{
DataRow dr = dt1.NewRow();

if (i > 0 && i < 4)
{
dr[1] = items[rnd.Next(i, items.Count())];
dr[2] = rnd.Next(i, 10000);

//Remove previously used Item from Array
items = items.Where(w => w != dr[1].ToString()).ToArray();
}
dt1.Rows.Add(dr);
}

//dt2 should only contain rows who have data in at least one column with the exception of the ID Column
DataTable dt2 = dt1.Rows.Cast<DataRow>()
.Where(w => w.ItemArray.Any(field => !string.IsNullOrEmpty(field.ToString().Trim()) && !(field is DBNull)))
.CopyToDataTable();
}

Обновить

Вот исправление благодаря Ивану Стоеву

    //dt2 should only contain rows who have data in at least one column with the exception of the ID Column
var columns = dt1.Columns.Cast<DataColumn>().Where(c => c.ColumnName != "ID").ToList();

DataTable dt2 = dt1.Rows.Cast<DataRow>()
.Where(w => columns.Select(c => w[c]).Any(field => !string.IsNullOrEmpty(field.ToString().Trim()) && !(field is DBNull)))
.CopyToDataTable();

Лучший ответ:

Вам нужно заменить ItemArray внутри запроса некоторым альтернативным методом доступа к данным DataRow, например, таким образом

var columns = dt1.Columns.Cast<DataColumn>().Where(c => c.ColumnName != "ID").ToList();
DataTable dt2 = dt1.Rows.Cast<DataRow>()
    .Where(r => columns.Select(c => r[c]).Any(field => ... 

Оцените статью
TechArks.Ru
Добавить комментарий