原文地址:http://msdn.microsoft.com/zh-cn/dd567295.aspx

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

LINQ to SQL 运行时动态构建查询条件相关推荐

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

    自FireflySoft.RateLimit发布以来,帮助了不少需要在.net中进行限流处理的用户.前段时间有个开发者发了一个pull request,大意是Redis重启的时候Lua script会 ...

  2. 运行时动态的开关 Spring Security

    为什么80%的码农都做不了架构师?>>>    1. 为什么要在运行时动态的开关 Spring Security? 考虑这样一个场景,当我们构建了一整套微服务架构的系统后,公司某个内 ...

  3. 运用delphiXE RTTI在运行时动态获取信息及获取某个TComponent类或TObject类的RttiType信息的案例

    运用delphiXE RTTI在运行时动态获取信息及获取某个TComponent类或TObject类的RttiType信息的案例 一.理解RTTI 先看看官方文档:http://docwiki.emb ...

  4. Java运行时动态加载类之URLClassLoader

    需求场景:通过URLClassLoader从jar文件中加载类并创建实例,可实现运行时动态加载 1.要加载的jar: 1)接口类IC package cn.fjs;public interface I ...

  5. SAP UI5 应用开发教程之五十八 - 使用工厂方法在运行时动态创建不同类型的列表行项目控件试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  6. SAP Spartacus table cell如何通过cxOutlet在运行时动态注入组件

    cxOutlet合集 SAP Spartacus自定义指令cxOutlet的工作原理 SAP Spartacus table cell如何通过cxOutlet在运行时动态注入组件 SAP Sparta ...

  7. 【java】Java运行时动态生成类几种方式

    1.概述 转载:Java运行时动态生成类几种方式 这里发现自己不知道的,原来Java 还能自己编译自己,学到了. 最近一个项目中利用规则引擎,提供用户拖拽式的灵活定义规则.这就要求根据数据库数据动态生 ...

  8. 动态生成java类_Java 运行时动态生成class

    Java是一门静态语言,通常,我们需要的class在编译的时候就已经生成了,为什么有时候我们还想在运行时动态生成class呢? 因为在有些时候,我们还真得在运行时为一个类动态创建子类.比如,编写一个O ...

  9. 运行时动态引入JS文件

    运行时动态引入JS文件(尚在开发环境) 1.添加方法 requireJSFiles export function requireJSFiles (target, pathArr) {return n ...

最新文章

  1. 摄像头YUV图像常见数据格式介绍
  2. centos php memcache扩展,CentOS安装php5的memcache扩展
  3. NVelocity:语法
  4. 高盛想要做华尔街的谷歌
  5. TLSNotary中心化预言机(2) 核心功能
  6. 16_非监督学习、k-means 4阶段、kmeans API、Kmeans性能评估指标、案例
  7. mybatis 批量将list数据插入到数据库
  8. SAP CRM OData multiple origin Composition的测试
  9. 球迷必备Euro Cup Mobile 2008 !-dopod touch diamond试用之欧洲杯
  10. 内核态和用户态的区别
  11. UE4 调试着色器编译过程
  12. android studio - 解决Android Studio不停的Indexing的问题
  13. 2021年最值得推荐的报表工具,无代码轻松实现可视化开发
  14. excel如何把多张表合并成一个表_从产品经理到总监,就差一张高价值Excel表
  15. 二度整理交换机有感(续)
  16. Scala进阶之路-尾递归优化
  17. Reeder 5.0.3 将RSS阅读体验发挥到极致
  18. 阿里云发布智慧书店解决方案 联手新华书店总店落地首个“城市书房”
  19. 远程计算机怎么安装系统,如何远程安装电脑系统
  20. 关于过期更换ssl证书的相关问题

热门文章

  1. 应用丨AI和机器学习如何改变美国政府决策方式
  2. 干货丨详解世界各国的人工智能布局
  3. Tensorflow— tensorboard网络运行
  4. 国拨经费约31.48亿!科技部发布科技创新2030 —“脑科学与类脑研究”重大项目2021年度项目申报指南...
  5. 打开AI芯片的“万能钥匙”
  6. 2020十大新兴技术揭晓!每一项都可能颠覆我们的生活
  7. 边缘计算技术发展与对策研究
  8. 生物科技发展与人类命运共同体塑造
  9. Nature:揭示大脑中的免疫记忆
  10. Semtech与Lacuna从太空接收信息