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

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

1.表达式树

1   public static IEnumerable<Customers> GetCustomersFunc1(string[] keywords)  
2     {  
3         DataClassesDataContext dc = new DataClassesDataContext();  

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

2.使用System.Linq.Dynamic

public static IEnumerable<Customers> GetCustomersFunc2(string[] keywords)  
2     { 
3         //需要引用System.Linq.Dynamic。Dynamic.cs文件可在LinqSamples中找到  
4   
5        DataClassesDataContext dc = new DataClassesDataContext();  
6         string queryString = "";  
7         foreach (string keyword in keywords) 
8         {  
9             //原形为(c=>c.CompanyName.Contains(keyword1)) || (c=>c.CompanyName.Contains(keyword2)) ||   
10             queryString += "CompanyName.Contains(\"" + keyword + "\") or "; 
11         } 
12  
13         //与false进行逻辑或运算,为了避免queryString中最后的or出现语法错误 
14         queryString += "1=0"; 
15         return dc.Customers.Where(queryString); 
16     } 
17

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

1     public static IEnumerable<Customers> GetCustomersFunc3(string[] keywords)  
2      {  
3         //这个方法其实是伪Linq,核心还是在拼接SQL语句,所以就不多解释了  
4         DataClassesDataContext dc = new DataClassesDataContext();  
5         string sqlQuery = "SELECT [CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], ";  
6         sqlQuery += "[City], [Region], [PostalCode],[Country], [Phone], [Fax] FROM [dbo].[Customers]  WHERE ";  
7         foreach (string keyword in keywords) 
8          {  
9             sqlQuery += "([CompanyName] LIKE ‘%" + keyword + "%‘ ) OR "; 
10         } 
11         sqlQuery += "(1=0)"; 
12         return dc.ExecuteQuery<Customers>(sqlQuery); 
13     } 
14  
15

时间: 2024-12-19 21:11:13

LINQ to SQL 运行时动态构建查询条件的相关文章

通过LINQ表达式树动态构建查询条件

第一种方法: public static class PredicateExtensions { public static Expression<Func<T, bool>> True<T>() { return f => true; } public static Expression<Func<T, bool>> False<T>() { return f => false; } public static Expr

浏览器客户端智能自动化:如何取得页面中JavaScript运行时动态生成的URL?

浏览器客户端智能自动化:如何取得页面中JavaScript运行时动态生成的URL? 需求 "页面智能拼接"指的是通过启发式查询DOM树,判断出"下一页"链接,取出其href属性.Chromium的官方插件DOM Distiller完成类似的工作,主要目的就是为了将多页点击流程变成单页的Ajax连续阅读体验. 问题是,现在有些网站为了阻止浏览器客户端这么做,将href属性设置为"#"(或javascript:void()),然后在其onclick事

C#在运行时动态创建类型的实现方法

本文实例讲述了C#在运行时动态创建类型的实现方法.是C#项目开发中很实用的技巧.分享给大家供大家参考.具体分析如下: 具体来说, C# 在运行时动态的创建类型是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型的 . 主要功能代码如下: public static Assembly NewAssembly() { //创建编译器实例. provider = new CSharpCodeProvider(); //设置编译参数. cp = new CompilerParame

编译时、运行时、构建时(二)

泛型(又称类型检验):这个是发生在编译期的.编译器负责检查程序中类型的正确性,然后把使用了泛型的代码翻译或者重写成可以执行在当前JVM上的非泛型代码.这个技术被称为“类型擦除“.换句话来说,编译器会擦除所有在尖括号里的类型信息,来保证和版本1.4.0或者更早版本的JRE的兼容性. List<String> myList = new ArrayList<String>(10); 编译后成为了: List myList = new ArrayList(10); 异常(Exception

编译时、运行时、构建时(一)

在开发和设计的时候,我们需要考虑编译时,运行时以及构建时这三个概念.理解这几个概念可以更好地帮助你去了解一些基本的原理.下面是初学者晋级中级水平需要知道的一些问题. Q.下面的代码片段中,行A和行B所标识的代码有什么区别呢? public class ConstantFolding { static final int number1 = 5; static final int number2 = 6; static int number3 = 5; static int number4= 6;

java-基础入门-泛型数组列表-解决运行时动态更改数组的问题

泛型数组列表,主要是为了解决运行时动态更改数组的问题 平常我们会定义一个部门里面的人员的一个数组, 但是在实际业务当中,这个数组的大小往往是不确定的, 如果定义过大,那么会浪费空间,定义过小,又不够用, 因为为了解决运行时动态更改数组的问题,我们提出下面的解决方案. package com.ray.object; import java.util.ArrayList; /** * 泛型数组列表 ,解决运行时动态更改数组的问题 * * @author ray * @since 2015-05-04

C# 在运行时动态创建类型

C# 在运行时动态的创建类型,这里是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型 public static Assembly NewAssembly() { //创建编译器实例. provider = new CSharpCodeProvider(); //设置编译参数. cp = new CompilerParameters(); cp.GenerateExecutable = false; cp.GenerateInMemory = true; // Gener

Android运行时动态权限获取

运行时动态权限简介 在targetSdkVersion小于23的应用中默认授予AndroidManifest中声明的所有权限,而无需手动授予.当targetSdkVersion在23或以上时,应用默认不会授予"Dangerous"级别的权限,Android默认只要授予该组一个权限即可获得该组的所有权限. 动态权限获取 下面将演示如何通过运行时权限获取来调用系统相机进行拍照和录制视频 首先以targetSdkVersion 23来编译调试应用,要调用相机拍照并存储需要在在AndroidM

转: gcc 指定运行时动态库路径

gcc 指定运行时动态库路径 Leave a reply 由于种种原因,Linux 下写 c 代码时要用到一些外部库(不属于标准C的库),可是由于没有权限,无法将这写库安装到系统目录,只好安装用户目录下如 /home/youname/lib,可是怎么编译才能让程序正常编译,并且正常运行呢.这样使用gcc:gcc -I/path/to/include/dir -L/path/to/lib/dir -llibname -Wl,-rpath,/path/to/lib/dir -o test test.