Rei*_*aka 18 c# linq dynamic .net-4.0
所以我刚刚从亚马逊的推荐信到对象LINQ使用C#4.0:使用和扩展LINQ到对象和并行LINQ(PLINQ) .
它说这本书介绍了使用dynamicLinq 的关键字,让我思考:
dynamic对于你无法用Linq 做的关键字,你能做什么样的超赞呢?
Joe*_*ari 21
这是一个想法:通过将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 };
Run Code Online (Sandbox Code Playgroud)
以下是定义AsDynamic扩展方法的方法.注意它如何返回动态的IEnumerable,这使它适用于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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过继承DynamicObject,这可以利用自定义绑定 - 您可以自己接管解析成员名称的过程.在这种情况下,我们将get和set成员访问绑定到在底层DataRow中检索或存储对象.