数据绑定匿名类型
就象我在贴子前面提到的那样,从CLR的立场来说,匿名类型和显式定义的类型间绝对毫无区别。匿名类型和var关键词纯属节省代码量的“语法糖”,其运行时语义跟显式定义的类型是完全一样的。
此外,这意味着,所有的标准.NET类型反射特性,对匿名类型也是工作的,即意味着,象绑定到UI控件的特性同样工作。例如,假如我要显示我前面的分层LINQ查询的结果,我可以象下面这样在一个.aspx网页里定义一个 <asp:gridview> 控件:
上面的.aspx 含有一个gridview,它有2个标准的boundfield列,一个含有嵌套的 <asp:bulletedlist> 控件的模板字段列,我将用这个嵌套控件来显示产品的分层订单细节的子结果集。
然后,我可以编写下面这个LINQ代码来对数据库做一个分层查询,然后将定制构形的数据结果绑定到GridView来显示:
因为GridView支持对任何 IEnumerable<T> 序列的绑定,使用反射获取属性值,它对我上面使用的匿名类型依然工作。
在运行时,上面的代码会产生一个产品细节以及产品最新的订单数量的分层列表的简单网格,象这样:
很明显地,你可以把这个报表做得更丰富,更漂亮,但希望你能从中了解到,现在对数据库做分层查询是多么的容易,可以对返回的结果做你要的构形,然后对结果用编程手法操作或将其绑定到UI控件上。
结语
匿名类型是个很方便的语言特性,允许开发人员在代码内简明地定义行内CLR类型,而不用提供一个正式的类定义声明。虽然它们可以在很多场合下使用,但在使用LINQ查询和转换/构形数据时尤其有用。
这个贴子结束了我5个部分的Orcas语言系列。以后,我会发表更多的LINQ贴子,来示范如何在实战上使用所有这些新语言特性来做常见的数据访问操作(定义数据模型,查询,更新,使用存储过程,验证等等)。但我想先把这个5个部分的语言系列完成,这样我们在我将来的贴子里深入探讨时,你才会真正理解所用的底层语言构造。
希望本文对你有所帮助,
Scott