所以我刚刚从亚马逊的推荐信到对象LINQ使用C#4.0:使用和扩展LINQ到对象和并行LINQ(PLINQ) .
它说这本书介绍了使用dynamic
Linq 的关键字,让我思考:
dynamic
对于你无法用Linq 做的关键字,你能做什么样的超赞呢?
这是一个想法:通过将LINQ与动态相结合,您可以像输入类型一样查询无类型数据集.
例如,假设myDataSet是无类型的DataSet.通过动态类型和名为AsDynamic()的扩展方法,可以实现以下功能:
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 };
以下是定义AsDynamic扩展方法的方法.注意它如何返回动态的IEnumerable,这使它适用于LINQ查询:
public static class Extensions { public static IEnumerableAsDynamic (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 GetDynamicMemberNames() { return _row.Table.Columns.Cast ().Select (dc => dc.ColumnName); } } }
通过继承DynamicObject,这可以利用自定义绑定 - 您可以自己接管解析成员名称的过程.在这种情况下,我们将get和set成员访问绑定到在底层DataRow中检索或存储对象.