当前位置:  开发笔记 > 编程语言 > 正文

在Linq中使用.NET 4动态关键字的好例子?

如何解决《在Linq中使用.NET4动态关键字的好例子?》经验,为你挑选了1个好方法。

所以我刚刚从亚马逊的推荐信到对象LINQ使用C#4.0:使用和扩展LINQ到对象和并行LINQ(PLINQ) .

它说这本书介绍了使用dynamicLinq 的关键字,让我思考:

dynamic对于你无法用Linq 做的关键字,你能做什么样的超赞呢?



1> Joe Albahari..:

这是一个想法:通过将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 IEnumerable 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 GetDynamicMemberNames()
    {   
        return _row.Table.Columns.Cast().Select (dc => dc.ColumnName);
    }
  }
}

通过继承DynamicObject,这可以利用自定义绑定 - 您可以自己接管解析成员名称的过程.在这种情况下,我们将get和set成员访问绑定到在底层DataRow中检索或存储对象.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有