LINQ to SQL 运行时动态构建查询条件

时间:2023-01-16 04:12:02

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

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

24LINQ to SQL 运行时动态构建查询条件
25LINQ to SQL 运行时动态构建查询条件        //创建一个以一个Customers类作为参数并返回bool类型的委托
26LINQ to SQL 运行时动态构建查询条件LINQ to SQL 运行时动态构建查询条件        Expression<Func<Customers, bool>> end = Expression.Lambda<Func<Customers, bool>>(condition, new ParameterExpression[] { c });
27LINQ to SQL 运行时动态构建查询条件
28LINQ to SQL 运行时动态构建查询条件        //使用刚才构建的条件进行查询
29LINQ to SQL 运行时动态构建查询条件        var result = dc.Customers.Where(end);
30LINQ to SQL 运行时动态构建查询条件        return result;
31LINQ to SQL 运行时动态构建查询条件    }

32 LINQ to SQL 运行时动态构建查询条件

2.使用System.Linq.Dynamic
 1 LINQ to SQL 运行时动态构建查询条件     public   static  IEnumerable < Customers >  GetCustomersFunc2( string [] keywords)
 2 LINQ to SQL 运行时动态构建查询条件LINQ to SQL 运行时动态构建查询条件     {
 3LINQ to SQL 运行时动态构建查询条件        //需要引用System.Linq.Dynamic。Dynamic.cs文件可在LinqSamples中找到
 4LINQ to SQL 运行时动态构建查询条件
 5LINQ to SQL 运行时动态构建查询条件        DataClassesDataContext dc = new DataClassesDataContext();
 6LINQ to SQL 运行时动态构建查询条件        string queryString = "";
 7LINQ to SQL 运行时动态构建查询条件        foreach (string keyword in keywords)
 8LINQ to SQL 运行时动态构建查询条件LINQ to SQL 运行时动态构建查询条件        {
 9LINQ to SQL 运行时动态构建查询条件            //原形为(c=>c.CompanyName.Contains(keyword1)) || (c=>c.CompanyName.Contains(keyword2)) || LINQ to SQL 运行时动态构建查询条件
10LINQ to SQL 运行时动态构建查询条件            queryString += "CompanyName.Contains(\"" + keyword + "\") or ";
11LINQ to SQL 运行时动态构建查询条件        }

12LINQ to SQL 运行时动态构建查询条件
13LINQ to SQL 运行时动态构建查询条件        //与false进行逻辑或运算,为了避免queryString中最后的or出现语法错误
14LINQ to SQL 运行时动态构建查询条件        queryString += "1=0";
15LINQ to SQL 运行时动态构建查询条件        return dc.Customers.Where(queryString);
16LINQ to SQL 运行时动态构建查询条件    }

17 LINQ to SQL 运行时动态构建查询条件

3.披着Linq的外衣拼接SQL语句

 1 LINQ to SQL 运行时动态构建查询条件     public   static  IEnumerable < Customers >  GetCustomersFunc3( string [] keywords)
 2 LINQ to SQL 运行时动态构建查询条件LINQ to SQL 运行时动态构建查询条件     {
 3LINQ to SQL 运行时动态构建查询条件        //这个方法其实是伪Linq,核心还是在拼接SQL语句,所以就不多解释了
 4LINQ to SQL 运行时动态构建查询条件        DataClassesDataContext dc = new DataClassesDataContext();
 5LINQ to SQL 运行时动态构建查询条件        string sqlQuery = "SELECT [CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], ";
 6LINQ to SQL 运行时动态构建查询条件        sqlQuery += "[City], [Region], [PostalCode],[Country], [Phone], [Fax] FROM [dbo].[Customers]  WHERE ";
 7LINQ to SQL 运行时动态构建查询条件        foreach (string keyword in keywords)
 8LINQ to SQL 运行时动态构建查询条件LINQ to SQL 运行时动态构建查询条件        {
 9LINQ to SQL 运行时动态构建查询条件            sqlQuery += "([CompanyName] LIKE '%" + keyword + "%' ) OR ";
10LINQ to SQL 运行时动态构建查询条件        }

11LINQ to SQL 运行时动态构建查询条件        sqlQuery += "(1=0)";
12LINQ to SQL 运行时动态构建查询条件        return dc.ExecuteQuery<Customers>(sqlQuery);
13LINQ to SQL 运行时动态构建查询条件    }

14 LINQ to SQL 运行时动态构建查询条件
15 LINQ to SQL 运行时动态构建查询条件