Io di solito dare me stesso metodi di estensione quando ho bisogno di trattare un oggetto pre-LINQ come un oggetto pronto per LINQ. Ad esempio, stai cercando di eseguire una query su una DataRowCollection (proprietà DataTable.Rows) che probabilmente non utilizzi per qualcosa di più di un elenco di DataRows. Creo un metodo di estensione che esegue questa trasformazione per te (DataRowCollection su List<DataRow>
). Inoltre, di solito uso un metodo di estensione per ottenere valori in modo sicuro quando non mi interessa lanciare un'eccezione se per qualche motivo viene fornito un nome di chiave non valido per la colonna. Quindi, puoi creare un metodo di estensione che prende un elenco di valori come ID e un nome di campo che contiene l'id per restituire ciò che desideri. Quando tutto è detto e fatto, questo viene fatto con una riga di codice. Ecco la classe con tutti i tuoi metodi di estensione.
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();
}
}
}
Poi, diversa impostazione delle variabili (che non avrebbe bisogno di fare ... si dispone già di loro), il vero lavoro è fatto con una sola riga di codice (EDIT: una sola chiamata di metodo):
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);
un modo per convertire in un DataTable è quello di utilizzare .CopyToDataTable(), in questo caso assicurarsi di controllare se matchingRows.Any() restituisce true prima di fare matchingRows.CopyToDataTable(). Ciò richiede System.Data.DataTableExtensions – Enrico