在进行数据查询时,经常碰到需要动态构建查询条件。使用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

2.使用System.Linq.Dynamic


 1    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
出处:http://www.cnblogs.com/snowdream/archive/2008/07/18/1246308.html
 

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

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

    第一种方法: public static class PredicateExtensions { public static Expression<Func<T, bool>> ...

  2. .NET6运行时动态更新限流阈值

    昨天博客园撑不住流量又崩溃了,很巧正在编写这篇文章,于是产生一个假想:如果博客园用上我这个限流组件会怎么样呢? 用户会收到几个429错误,并且多刷新几次就看到了内容,不会出现完全不可用. 还可以降低查 ...

  3. 正确理解java编译时,运行时以及构建时这三个概念

    Java中的许多对象(一般都是具有父子类关系的父类对象)在运行时都会出现两种类型:编译时类型和运行时类型,例如:Person person = new Student();这行代码将会生成一个pers ...

  4. SpringBoot运行时动态添加数据源

    此方案适用于解决springboot项目运行时动态添加数据源,非静态切换多数据源!!! 一.多数据源应用场景: 1.配置文件配置多数据源,如默认数据源:master,数据源1:salve1...,运行 ...

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

    C# 在运行时动态的创建类型,这里是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型 public static Assembly NewAssembly() { //创建编译 ...

  6. 使用javassist运行时动态重新加载java类及其他替换选择

    在不少的情况下,我们需要对生产中的系统进行问题排查,但是又不能重启应用,java应用不同于数据库的存储过程,至少到目前为止,还不能原生的支持随时进行编译替换,从这种角度来说,数据库比java的动态性要 ...

  7. 运行时动态库:not found 及介绍-linux的-Wl,-rpath命令

    ---此文章同步自我的CSDN博客--- 一.运行时动态库:not found   今天在使用linux编写c/c++程序时,需要用到第三方的动态库文件.刚开始编译完后,运行提示找不到动态库文件.我就 ...

  8. C++高效安全的运行时动态类型转换

    关键字:static_cast,dynamic_cast,fast_dynamic_cast,VS 2015. OS:Window 10. C++类之间类型转换有:static_cast.dynami ...

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

    gcc 指定运行时动态库路径 Leave a reply 由于种种原因,Linux 下写 c 代码时要用到一些外部库(不属于标准C的库),可是由于没有权限,无法将这写库安装到系统目录,只好安装用户目录 ...

随机推荐

  1. java or spring +jython +python (Error:python.home,Determine if the following attributes are correct:)

    最近更新 :16年3月10日更 首先你在用JAVA,你需要运行Python,于是你找了Jython,我不介绍什么是Jythyon了 如何在Java中调用Python的方法,一百度一大堆, 如下:是一种 ...

  2. Microsd卡中植入NFC技术设计

    NFC(Near Field Communication,近距离通信),是基于RFID技术发展起来的一种应用在手机上的近距离无线通信技术,主要应用在以下三种模式: 卡模拟状态:手机作为支付工具,可以模 ...

  3. Android ToolBar详解

    今年(2014) 的 google i/o 发表令多数人为之一亮的 material design,而 google 也从「google i/o 2014」 开始,大家也陆陆续续地看到其更新的 and ...

  4. cloudera安装hadoop集群和相关服务

    一.软件准备: 1.下载cloudera-manager-installer.bin(安装...-server),cdh4.cm(这是...-agent),另外还有些需要的关联软件下步添加. 2.先建 ...

  5. Android实用代码七段(一)

    前言 这里积累了一些不常见确又很实用的代码,每收集7条更新一次,希望能对大家有用. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: htt ...

  6. Service Locator 模式

    什么是Service Locator 模式? 服务定位模式(Service Locator Pattern)是一种软件开发中的设计模式,通过应用强大的抽象层,可对涉及尝试获取一个服务的过程进行封装.该 ...

  7. C++中new和malloc

    1.malloc的工作原理: malloc使用一个数据结构(链表)来维护分配空间链表的构成:分配的空间/上一个空间的数据/下一个空间/空间大小等信息.    对malloc分配的空间不要越界访问,因为 ...

  8. vijosP1059 积木城堡

    vijosP1059 积木城堡 链接:https://vijos.org/p/1059 [思路] 01背包. 刚开始想麻烦了,想的是二分答案然后01背包判断是否可行,但是首先答案不满足单调性所以不能二 ...

  9. 折腾iPhone的生活——越狱

    这次我也加入了越狱大军,也不是为的什么免费软件,只是遵从我玩机的本质,既然想要玩透这个机子,当然要所有都试过来,就果断越狱了,关于越狱的好处和坏处,我会在另外一篇博客里阐述,这篇博客主要就说怎么样进行 ...

  10. c++函数模板声明与定义相分离

    最近在仿写stl,发现stl源码中将模板的声明与定义写在一起实在很不优雅.自己尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义,然后在main函数里包含.h头文件,这样会报链接错误.这是因 ...