Как скопировать все строки в datatable в массив datarow?

У меня есть две таблицы:

tbl_ClassFac: ClassFacNo (первичный ключ), FacultyID, ClassID

tbl_EmpClassFac: EmpID, (первичный ключ) DateImplement, (первичный ключ) ClassFacNo

Я хочу знать всех Сотрудников, которые находятся на определенном ClassFacNo. т.е. Все EmpID с определенным ClassFacNo... Я сначала ищу tbl_EmpClassFac с EmpID, предоставленным пользователем. Я храню эти строки данных. Затем используйте ClassFacNo из этих строк данных для поиска в tbl_ClassFac. Ниже приведен мой код.

        empRowsCF = ClassFacDS.Tables["EmpClassFac"].Select("EmpID='" + txt_SearchValueCF.Text + "'");
        int maxempRowsCF = empRowsCF.Length;
        if (maxempRowsCF > 0)
        {
            foundempDT = ClassFacDS.Tables["ClassFac"].Clone();
            foreach (DataRow dRow in empRowsCF)
            {
                returnedRowsCF = ClassFacDS.Tables["ClassFac"].Select("ClassFacNo='" + dRow[2].ToString() + "'");
                foundempDT.ImportRow(returnedRowsCF[0]);
            }
        }
        dataGrid_CF.DataSource = null;
        dataGrid_CF.DataSource = foundempDT.DefaultView;

        ***returnedRowsCF = foundempDT.Rows;*** // so NavigateRecordsCF can be used

        NavigateRecordsCF("F");  // function to display data in textboxes (no importance here)

Я знаю, что код не очень хорош, но это все, что я могу придумать. Если у кого-то есть какие-либо предложения, пожалуйста, сообщите мне. Если нет, скажите мне, как мне скопировать все строки в datatable в массив datarow???


person Waqas Ali    schedule 27.01.2013    source источник


Ответы (1)


"Как скопировать все строки таблицы данных в массив строк данных?"

Если это поможет, используйте перегрузку Select без параметра

DataRow[] rows = table.Select();

DataTable.Select()

Получает массив всех объектов DataRow.

По остальной части вашего вопроса: на самом деле не ясно, в чем вопрос.

Но я предполагаю, что вы хотите отфильтровать первую таблицу по значению поля во второй (связанной) таблице. Вы можете использовать этот краткий Linq-To-DataSet запрос:

var rows = from cfrow in tbl_ClassFac.AsEnumerable()
           join ecfRow in tbl_EmpClassFac.AsEnumerable()
           on cfrow.Field<int>("ClassFacNo") equals ecfRow.Field<int>("ClassFacNo")
           where ecfRow.Field<int>("EmpId") == EmpId
           select cfrow;
// if you want a new DataTable from the filtered tbl_ClassFac-DataRows:
var tblResult = rows.CopyToDataTable();

Обратите внимание, что вы можете получить исключение в CopyToDataTable, если последовательность строк данных пуста, поэтому фильтр не вернул ни одной строки. Вы можете избежать этого следующим образом:

var tblResult = rows.Any() ? rows.CopyToDataTable() : tbl_ClassFac.Clone(); // empty table with same columns as source table
person Tim Schmelter    schedule 27.01.2013
comment
Пример: Я хочу знать всех сотрудников, которые имеют/имели ClassFacNo 2 Что бы вы сделали??? - person Waqas Ali; 28.01.2013
comment
@WaqasAli: отредактировал мой ответ, чтобы показать вам, как вы можете использовать Linq-To-DataSet с Enumerable.Join для получения желаемого результата. Join эффективен, потому что внутри использует хеш-таблицу. Он берет строки из первых таблиц, затем берет только строки с совпадающим ключом из второй таблицы, затем только строки с совпадающим ключом из третьей таблицы и так далее. - person Tim Schmelter; 28.01.2013
comment
Да, тот же результат, что и у меня, но намного элегантнее. Бесконечно благодарен. - person Waqas Ali; 28.01.2013