【原文地址】Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)
【原文发表日期】 Monday, January 07, 2008 11:02 PM
LINQ (语言级集成查询)是VS 2008 和 .NET 3.5中提供的一个新特性。LINQ使得数据查询的概念成为.NET中的一等编程概念,允许你在你喜欢的编程语言中有效地表达查询。
LINQ的一个好处是,它允许你使用 VB 和 C#. 编写类安全的查询。这意味着,对你的代码,你会得到对LINQ查询的编译时检查,以及完整的intellisense和重构支持:
类安全的查询可用于大多数的场景,但也有些情形,你需要能在运行时动态构建查询的灵活性。例如,你也许要在应用中提供商业智能的界面,允许业务分析员用户使用下拉框在数据之上构造和表达他们自己的自定义查询/视图。
按惯例,这类动态查询场景经常是通过把字符串连接起来构建成动态SQL查询的方式来处理的。最近有几个人通过电邮问我该如何使用LINQ来处理这类场景。下面的贴子内容将描述如何使用LINQ开发团队提供的“动态查询库(Dynamic Query Library)”来动态地构建LINQ查询。
下载LINQ动态查询库
VS 2008样例下载网页上包括了指向一个VB和C#样例包的链接,该样例包内含一个很酷的动态查询LINQ辅助库。该动态查询库(以及相关文档)的直接链接如下:
- VB Dynamic Query Library (included in the \Language Samples\LINQ Samples\DynamicQuery directory)
- C# Dynamic Query Library (included in the \LinqSamples\DynamicQuery directory)
VB和C#的DynamicQuery例程都包括了一个辅助库的源码实现,该辅助库允许你使用接受字符串参数(而不是类安全的语言运算符)的扩展方法来表示LINQ查询。你可以把C#或VB的DynamicQuery库的实现拷贝到你自己的项目中,然后在适当的地方根据用户的输入用它来动态地构建LINQ查询。
动态查询库的简单示例
你可以将DynamicQuery库用于任何LINQ数据provider,这些provider包括LINQ to SQL, LINQ to Objects, LINQ to XML, LINQ to Entities, LINQ to SharePoint, LINQ to TerraServer等等。动态查询库不是使用语言级的运算符或类安全的 lambda 扩展方法来构建LINQ查询,而是提供给你基于字符串的扩展方法,你可以用这些方法来传递任何字符串表达式。
例如,下面是用VB编写的一个标准的类安全LINQ to SQL查询,从 Northwind 数据库中获取数据,然后在一个ASP.NET GridView 控件中做显示:
使用LINQ DynamicQuery库,我可以将上面的查询表达式重写成:
注意,其中的条件式 where 子句和排序的 orderby 子句现在接受字符串表达式,而不是代码表达式。因为它们是后期绑定字符串,我可以动态地构建它们。例如,我可以提供界面给业务分析员用户,允许他们自己构建查询(包括任意的条件子句)。
动态查询库文档
在上面的 VB 和 C# 动态查询例程中还有一些HTML文档,详细描述了如何使用动态查询库中的扩展方法。如果你想要更深入地使用这个辅助库的话,这些文档绝对是值得一读的:
下载和运行动态查询库的样例
你可以下载和运行我编写的 VB 和C# 基本例程,在其中我示范了在一个ASP.NET 网站项目中使用动态的LINQ库对Northwind数据库进行LINQ to SQL查询:
- Basic Dynamic LINQ VB Sample
- Basic Dynamic LINQ C# Sample
你可以使用免费的Visual Web Developer 2008 Express版或者VS 2008打开运行这些项目。
构建动态LINQ查询的其他方法
动态查询库简单易用,在那些查询是完全动态,你要提供界面给用户,助他们构建这些动态查询的场景下尤其有用。
在将来的贴子里,我将对构建动态LINQ查询做深入探讨,讨论如何使用类安全的predicate方法来对你的代码进行结构化(《C# 3.0 In a Nutshell 》一书的作者Joseph 和 Ben Albahari,对此有个很精彩的贴子,在 这里)。
希望本文对你有所帮助