在之前的两篇文章中,我对Lambda表达式进行了一些必要的介绍。到目前为止,还基本上停留在表面,没有进行实际的操练。OK,在这篇文章里,我将会以实例来向读者说明如何以编程的方式创建Lambda表达式。
在我们实际的开发过程中,Lambda表达式最多的就是运用在对数据库的查询环节。由于在数据查询过程中可能会有许多种条件组合在一起,因此如果仅由一条静态的语句来构建查询条件会显示非常复杂。相信做过这类程序的人都很明白,要解决这个问题最简单的办法就是根据指定的参数动态构造SQL语句。可是如果你目前正在使用Linq To Sql,你就会发现要直接使用SQL语句会显得很麻烦,但却又不知道在强类型的查询中应该如何实现先前那种具有弹性的查询方式。那么接下来,我就会以实例来介绍如何通过动态构建Lambda表达式来实现这样的需求。
本次实例以一个通讯录中的联系人作为介绍对象,假设数据库中的表名为dbo.Contacts,程序中类型的名称为Contact。首先,来看一下表结构和实体类的说明:
| 字段名称 | 字段类型 | 属性名称 | 属性类型 | 说明 |
|---|---|---|---|---|
| id | uniqueidentifier, PK | ID | System.Guid | 联系人的唯一标识 |
| name | nvarchar(30), NOT NULL | Name | System.String (string) | 联系人姓名 |
| group | nvarchar(20), NULL | Group | System.String (string) | 联系人所属分组的名称 |
| age | int, NULL | Age | System.Nullable<int> (int?) | 联系人的年龄 |
现在开始设想一下,Contact类有一个静态方法用来获取满足条件的联系人,并以数组的形式返回:
public static Contact[] GetContacts(string name, string group, int? ageLower, int? ageUpper);
参数说明如下:
name - 联系人姓名,以包含的方式匹配。
group - 分组,以相等的方式匹配。
ageLower - 年龄范围低限,以大于或等于的方式匹配。
ageUpper - 年龄范围高限,以小于或等于的方式匹配。
以上所有参数都可为空,如果为空表示忽略这个条件。
这样一个查询,如果采用动态构造SQL语句的办法,在参数值全部指定了的情况下,可能会是如下形式:
SELECT id, name, group, age FROM dbo.Contacts WHERE name LIKE @name AND group = @group AND age >= @ageLower AND age <= @ageUpper ORDER BY name;
接下来,我们就要用Linq to sql来实现与之等效的功能。先来看看在参数齐全的情况下,这个查询怎么写,假设DataContext的名称为dataContext:
var q = from o in dataContext.Contacts
where o.Name.Contains(name) && o.Group == group && o.Age >= ageLower && o.Age <= ageUpper
select o
orderby o.Name;
以上的两个示例都是在参数值全部指定的情况下所创建的,那么,假如仅指定一个name参数,而其它都是空值,表达式就有变化了:
var q = from o in dataContext.Contacts
where o.Name.Contains(name)
select o
&

本文通过实例讲解如何使用编程方式动态构建Lambda表达式,以满足在Linq to Sql中根据不同参数灵活构建查询条件的需求。文章详细介绍了如何根据参数创建表达式树,并通过表达式树的组合实现动态查询,从而避免硬编码和复杂的SQL字符串拼接。
最低0.47元/天 解锁文章
1459





