Uno degli scenari in cui risulta spesso comod(issim)o ricorrere a LINQ to DataSet è l'elaborazione di dati in formato tabellare provenienti da datasheet Excel 97-2003 (.xls).
Supponiamo di voler processare, tramite il nostro applicativo, un datasheet come il seguente:
Alternativamente ai soliti statement di interrogazione dei DataSet, ora possiamo utilizzare LINQ to DataSet per accedere ai dati in maniera molto più potente ed espressiva, magari per effettuare operazioni complesse (magari difficilmente riproducibili con ADO.NET 2.0) o semplicemente per rendere il nostro codice maggiormente leggibile/manutenibile. A riguardo, riporto un semplice esempio di come poter sfruttare LINQ to DataSet in scenari come questo:
string filename = @"C:\Sample.xls";
string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filename + ";" + "Extended Properties=Excel 8.0;";
OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT * FROM [SampleData$]", connectionString);
DataTable dataTable_products = new DataTable("Products");
dataAdapter.Fill(dataTable_products);
// Es. 1: Calcolo spese totali per prodotto
var grouped_products = from row in dataTable_products.AsEnumerable()
group row by new { ProductName = row.Field<string>("ProductName") }
into productGroup
select new {
ProductName = productGroup.Key.ProductName,
TotalCost = productGroup.Sum(row => (double)row.Field<decimal>("UnitPrice") * row.Field<double>("Qty"))
};
foreach (var product in grouped_products)
{
Console.Write("{0} ", product.ProductName);
Console.WriteLine(product.TotalCost.ToString("C"));
}
// Es. 2: Calcolo spese totali
double total = dataTable_products.AsEnumerable().Sum(row => (double)row.Field<decimal>("UnitPrice") * row.Field<double>("Qty"));
Console.WriteLine("Total: {0}", total.ToString("C"));
Facile, rapido, LEGGIBILE... Grazie LINQ!!!
N.B.: Ovviamente il funzionamento dell'esempio riportato presuppone che la prima riga del datasheet contenga i nomi delle colonne.
Technorati Tag:
Excel,
LINQ,
DataSet