Welcome

首页 / 软件开发 / LINQ / LINQ to SQL运行时动态构建查询条件

LINQ to SQL运行时动态构建查询条件2011-11-17 诸剑俊 在进行数据查询时,经常碰到需要动态构建查询条件。使用LINQ实现这个需求可能会比以前拼接SQL语 句更麻烦一些。本文介绍了3种运行时动态构建查询条件的方法。本文中的例子最终实现的都是同一个功 能,从Northwind数据库Customers表中搜索出CompanyName列带有keywords中任意元素的项。keywords是 个字符串数组,该数组长度在编译时是不确定的。思路及方法说明写在代码注释中。

1.表达式树

1 public static IEnumerable<Customers> GetCustomersFunc1(string[] keywords)
2 {
3 DataClassesDataContext dc = new DataClassesDataContext();
4
5 //创建一个静态类型为Customers的参数表达 式
6 ParameterExpression c = Expression.Parameter(typeof(Customers), "c");
7
8 //创建一个恒等于false的表达式,用于与下面的表达式取并集
9 Expression condition = Expression.Constant(false);
10 foreach (string keyword in keywords)
11 {
12 //该表达式用于判断一个Customers类的CompanyName属性的值是否包含了关键字keyword
13 Expression con = Expression.Call(
14 Expression.Property (c, typeof(Customers).GetProperty("CompanyName")),
15 typeof(string).GetMethod("Contains", new Type[] { typeof(string) }),
16 Expression.Constant(keyword));
17
18 //与之前的condition表达 式进行逻辑或运算。
19 //如果要查找的项需要包含keywords中的所有 关键字,则可使用Expression.And(con, condition)20 //并且将Expression condition = Expression.Constant(false);
21 //改成Expression condition = Expression.Constant(true);
22 condition = Expression.Or(con, condition);
23 }
24
25 //创建 一个以一个Customers类作为参数并返回bool类型的委托
26 Expression<Func<Customers, bool>> end = Expression.Lambda<Func<Customers, bool>>(condition, new ParameterExpression[] { c });
27
28 //使用刚才构建的条件进 行查询
29 var result = dc.Customers.Where(end);
30 return result;
31 }
32