Voici une idée: en combinant LINQ avec dynamic, vous pouvez interroger des jeux de données non typés comme s'ils étaient tapés.
Par exemple, supposons que myDataSet est un DataSet non typé. Avec typage dynamique et une méthode d'extension appelée AsDynamic(), ce qui suit est possible:
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 };
Voici comment définir la méthode d'extension AsDynamic. Remarquez comment il retourne IEnumerable de dynamique, ce qui le rend approprié pour les requêtes 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);
}
}
}
Par DynamicObject sous-classement, cela profite de liaison personnalisée - où vous prenez sur le processus de résolution des noms de membres vous-même. Dans ce cas, nous lions l'accès des membres get et set à la récupération ou au stockage des objets dans le DataRow sous-jacent.
Si je fais une requête Linq sur un objet dynamique, j'obtiens 'erreur CS1979: Les expressions de requête sur le type de source « dynamique » ou avec une séquence de jointure de type « dynamique » ne sont pas autorisée de: S. –
Un peu de lecture dans les limites actuelles de l'utilisation de LINQ avec la dynamique, et quelques façons de travailler autour d'eux: http://weblogs.asp.net/davidfowler/archive/2010/08/04/dynamic-linq-a-little- plus-dynamique.aspx – egoodberry