LINQ to SQL 运行时动态构建查询条件
原文地址: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 运行时动态构建查询条件相关推荐
- .NET6运行时动态更新限流阈值
自FireflySoft.RateLimit发布以来,帮助了不少需要在.net中进行限流处理的用户.前段时间有个开发者发了一个pull request,大意是Redis重启的时候Lua script会 ...
- 运行时动态的开关 Spring Security
为什么80%的码农都做不了架构师?>>> 1. 为什么要在运行时动态的开关 Spring Security? 考虑这样一个场景,当我们构建了一整套微服务架构的系统后,公司某个内 ...
- 运用delphiXE RTTI在运行时动态获取信息及获取某个TComponent类或TObject类的RttiType信息的案例
运用delphiXE RTTI在运行时动态获取信息及获取某个TComponent类或TObject类的RttiType信息的案例 一.理解RTTI 先看看官方文档:http://docwiki.emb ...
- Java运行时动态加载类之URLClassLoader
需求场景:通过URLClassLoader从jar文件中加载类并创建实例,可实现运行时动态加载 1.要加载的jar: 1)接口类IC package cn.fjs;public interface I ...
- SAP UI5 应用开发教程之五十八 - 使用工厂方法在运行时动态创建不同类型的列表行项目控件试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- SAP Spartacus table cell如何通过cxOutlet在运行时动态注入组件
cxOutlet合集 SAP Spartacus自定义指令cxOutlet的工作原理 SAP Spartacus table cell如何通过cxOutlet在运行时动态注入组件 SAP Sparta ...
- 【java】Java运行时动态生成类几种方式
1.概述 转载:Java运行时动态生成类几种方式 这里发现自己不知道的,原来Java 还能自己编译自己,学到了. 最近一个项目中利用规则引擎,提供用户拖拽式的灵活定义规则.这就要求根据数据库数据动态生 ...
- 动态生成java类_Java 运行时动态生成class
Java是一门静态语言,通常,我们需要的class在编译的时候就已经生成了,为什么有时候我们还想在运行时动态生成class呢? 因为在有些时候,我们还真得在运行时为一个类动态创建子类.比如,编写一个O ...
- 运行时动态引入JS文件
运行时动态引入JS文件(尚在开发环境) 1.添加方法 requireJSFiles export function requireJSFiles (target, pathArr) {return n ...
最新文章
- 摄像头YUV图像常见数据格式介绍
- centos php memcache扩展,CentOS安装php5的memcache扩展
- NVelocity:语法
- 高盛想要做华尔街的谷歌
- TLSNotary中心化预言机(2) 核心功能
- 16_非监督学习、k-means 4阶段、kmeans API、Kmeans性能评估指标、案例
- mybatis 批量将list数据插入到数据库
- SAP CRM OData multiple origin Composition的测试
- 球迷必备Euro Cup Mobile 2008 !-dopod touch diamond试用之欧洲杯
- 内核态和用户态的区别
- UE4 调试着色器编译过程
- android studio - 解决Android Studio不停的Indexing的问题
- 2021年最值得推荐的报表工具,无代码轻松实现可视化开发
- excel如何把多张表合并成一个表_从产品经理到总监,就差一张高价值Excel表
- 二度整理交换机有感(续)
- Scala进阶之路-尾递归优化
- Reeder 5.0.3 将RSS阅读体验发挥到极致
- 阿里云发布智慧书店解决方案 联手新华书店总店落地首个“城市书房”
- 远程计算机怎么安装系统,如何远程安装电脑系统
- 关于过期更换ssl证书的相关问题
热门文章
- 应用丨AI和机器学习如何改变美国政府决策方式
- 干货丨详解世界各国的人工智能布局
- Tensorflow— tensorboard网络运行
- 国拨经费约31.48亿!科技部发布科技创新2030 —“脑科学与类脑研究”重大项目2021年度项目申报指南...
- 打开AI芯片的“万能钥匙”
- 2020十大新兴技术揭晓!每一项都可能颠覆我们的生活
- 边缘计算技术发展与对策研究
- 生物科技发展与人类命运共同体塑造
- Nature:揭示大脑中的免疫记忆
- Semtech与Lacuna从太空接收信息