I zwykle dają sam metody rozszerzenia, gdy muszę traktować obiekt przed LINQ jako obiekt gotowy LINQ. Na przykład, szukasz kwerendy na DataRowCollection (właściwość DataTable.Rows), które prawdopodobnie nie używasz do niczego więcej niż listę DataRows. Zrobiłbym metodę rozszerzenia, która wykonuje tę transformację dla ciebie (DataRowCollection do List<DataRow>
). Zwykle używam metody rozszerzania, aby bezpiecznie uzyskiwać wartości, gdy nie mam ochoty wyrzucić wyjątku, jeśli z jakiegoś powodu podano niepoprawną nazwę klucza dla kolumny. Następnie możesz utworzyć metodę rozszerzenia, która pobiera listę int jako id i nazwę pola zawierającego identyfikator, aby zwrócić to, co chcesz. Kiedy wszystko jest powiedziane i zrobione, robi się to za pomocą jednej linii kodu. Oto klasa z wszystkimi metodami rozszerzenia.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication11
{
public static class SystemDataHelpers
{
public static List<DataRow> RowList(this DataTable table)
{
List<DataRow> list = new List<DataRow>();
foreach (DataRow row in table.Rows)
list.Add(row);
return list;
}
public static object GetItem(this DataRow row, string field)
{
if (!row.Table.Columns.Contains(field))
return null;
return row[field];
}
public static List<DataRow> GetRows(this DataTable table, List<int> ids, string fieldName)
{
Func<DataRow, bool> filter = row => ids.Contains((int)row.GetItem(fieldName));
return table.RowList().Where(filter).ToList();
}
}
}
Następnie, inne niż konfigurowania zmiennych (który nie musiałby robić ... masz już im), prawdziwa praca odbywa się z jednej linii kodu (EDIT: jedno wywołanie metody):
DataTable table = new DataTable();
List<int> rowIds = new List<int> { 1, 2, 3, 4 };
string idFieldName = "row_id";
List<DataRow> selected = table.GetRows(rowIds, idFieldName);
Jednym sposobem konwersji do DataTable jest za pomocą .CopyToDataTable(), w tym przypadku upewnij się, aby sprawdzić, czy matchingRows.Any() zwraca true przed wykonaniem matchingRows.CopyToDataTable(). Wymaga to System.Data.DataTableExtensions – Enrico