Ecco un'idea: combinando LINQ con dinamico, è possibile eseguire query su set di dati non tipizzati come se fossero stati digitati.
Ad esempio, supporre che myDataSet sia un DataSet non tipizzato. Con tipizzazione dinamica e un metodo di estensione chiamato AsDynamic(), il seguente è possibile:
var query = from cust in myDataSet.Tables[0].AsDynamic()
where cust.LastName.StartsWith ("A")
orderby cust.LastName, cust.FirstName
select new { cust.ID, cust.LastName, cust.FirstName, cust.BirthDate };
Ecco come definire il metodo di estensione AsDynamic. Notate come restituisce IEnumerable di dinamica, che lo rende adatto per le query LINQ:
public static class Extensions
{
public static IEnumerable<dynamic> AsDynamic (this DataTable dt)
{
foreach (DataRow row in dt.Rows) yield return row.AsDynamic();
}
public static dynamic AsDynamic (this DataRow row)
{
return new DynamicDataRow (row);
}
class DynamicDataRow : DynamicObject
{
DataRow _row;
public DynamicDataRow (DataRow row) { _row = row; }
public override bool TryGetMember (GetMemberBinder binder, out object result)
{
result = _row[binder.Name];
return true;
}
public override bool TrySetMember (SetMemberBinder binder, object value)
{
_row[binder.Name] = value;
return true;
}
public override IEnumerable<string> GetDynamicMemberNames()
{
return _row.Table.Columns.Cast<DataColumn>().Select (dc => dc.ColumnName);
}
}
}
sottoclasse DynamicObject, questo si avvale di costume vincolante - dove si prende il processo di risoluzione di nomi dei membri da soli. In questo caso, associamo l'accesso get e set ai membri per recuperare o archiviare oggetti nella DataRow sottostante.
fonte
2010-11-07 14:42:45
Se faccio una query LINQ su un oggetto dinamico, ottengo 'errore CS1979: espressioni di query oltre tipo di origine 'dinamica' o con una sequenza join di tipo 'dinamico' non sono allowed': S. –
Una piccola lettura degli attuali limiti dell'uso di LINQ con le dinamiche e alcuni metodi per aggirarli: http://weblogs.asp.net/davidfowler/archive/2010/08/04/dynamic-linq-a-little- more-dynamic.aspx – egoodberry