Linq 动态查询库

news/2024/8/26 13:38:32

【原文地址】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和重构支持:

step16.jpg

类安全的查询可用于大多数的场景,但也有些情形,你需要能在运行时动态构建查询的灵活性。例如,你也许要在应用中提供商业智能的界面,允许业务分析员用户使用下拉框在数据之上构造和表达他们自己的自定义查询/视图。

按惯例,这类动态查询场景经常是通过把字符串连接起来构建成动态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 控件中做显示:

step1.png

使用LINQ DynamicQuery库,我可以将上面的查询表达式重写成:

step2.png 

注意,其中的条件式 where 子句和排序的 orderby 子句现在接受字符串表达式,而不是代码表达式。因为它们是后期绑定字符串,我可以动态地构建它们。例如,我可以提供界面给业务分析员用户,允许他们自己构建查询(包括任意的条件子句)。

动态查询库文档

在上面的 VB 和 C# 动态查询例程中还有一些HTML文档,详细描述了如何使用动态查询库中的扩展方法。如果你想要更深入地使用这个辅助库的话,这些文档绝对是值得一读的:

step5.png 

下载和运行动态查询库的样例

你可以下载和运行我编写的 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,对此有个很精彩的贴子,在 这里)。

希望本文对你有所帮助


http://www.niftyadmin.cn/n/4821456.html

相关文章

CentOS下screen 命令详解

一、背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它…

javascript的fn方法(转)

jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。 jQuery.fn.extend(object);给jQuery对象添加方法。 fn 是什么东西呢。查看jQuery代码&#…

typedef的常用用法

1.常规变量类型定义 例如:typedef unsigned char uchar 描述:uchar等价于unsigned char类型定义 uchar c声明等于unsigned char c声明 2.数组类型定义 例如: typedef int array[2]; 描述: array等价于 int [2]定义; …

Spark-Shell交互式客户端

启动交互shell [roothdp-1 bin]# ./spark-shell --master spark://hdp-2:7077 --executor-memory 500m --total-executor-cores 1 --master spark://hdp-2:7077 sparkmaster节点的地址 --executor-memory 500m --total-executor-cores 1 运行wordcount程序 sc.textFil…

查看Centos系统最近一次启动时间和运行时间

1.uptime命令[sql] view plaincopy [sparkMaster Log_Data]$ uptime 09:18:01 up 20:17, 1 user, load average: 0.13, 0.12, 0.14 2.查看/proc/uptime文件计算系统启动时间[sql] view plaincopy [sparkMaster Log_Data]$ cat /proc/uptime 73064.44 276161.85 输出: 73…

解决 | Beyond Compare打开报错

Beyond Compare打开报错 删除C:\Users\Administrator\AppData\Roaming\Scooter Software\Beyond Compare 3下的所有文件

CentOS系统资源常用命令

系统: # uname -a # 查看内核/操作系统/CPU信息 # cat /etc/issue # cat /etc/redhat-release # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod …

Azure ARM (5) ARM Template初探 - 本地JSON Template文件(1)

《Windows Azure Platform 系列文章目录》 Azure ARM (1) 概览 Azure ARM (2) 概览 Azure ARM (3) ARM支持的服务类型 Azure ARM (4) 开始创建ARM Resource Group并创建存储账户 本文需要的ARM Template,在这里下载。 在之前的文章里,笔者介绍了&#xf…