Linq to Sql 动态条件另类实现方法
其实我也不知道是不是另类的,反正我找了好久园子里和其他资源。
无外乎两类
1,构造动态表达式的,这个真心繁琐,我是懒人,不想弄表达式。
2,拼SQL语句,直接执行,这个和ado.net就没有啥区别了。
我想继续用Linq,有不想用上面的两种方法,于是我测试了下面这种方法,结果完全符合预期,看看是怎么写的吧。
记录在这里,以备查阅
var result = from s in ct.dbContext.LT_Survey
join r in ct.dbContext.LT_Inquiry on s.InquiryCode equals r.InquiryCode
join ig in ct.dbContext.LM_InquiryGuide on r.GuideNo equals ig.GuideCode into temp
from tt in temp.DefaultIfEmpty()
where
((!string.IsNullOrEmpty(notificationDateS) && r.NotificationDate.CompareTo(notificationDateS) >= ) || string.IsNullOrEmpty(notificationDateS))
&& ((!string.IsNullOrEmpty(notificationdateE) && r.NotificationDate.CompareTo(notificationdateE) <= ) || string.IsNullOrEmpty(notificationdateE))
&& (s.ForEarthwork == || s.ForEarthwork == )
select new
{
s.ForEarthwork,
r.GuideNo,
r.NoticeDate };
主要看where后面的两句,notificationDateS,和notificationDateE是一个开始日期和结束日期,在画面上是动态条件。可以不输入,或是输入其中一个,或是两个都输入。实现的要点就是这一句(!string.IsNullOrEmpty(notificationDateS) && r.NotificationDate.CompareTo(notificationDateS) >= 0) || string.IsNullOrEmpty(notificationDateS),我只能说linq很智能,他能推测出,如果notificationDateS为空,这一窜就是个恒等于真的表达式,linq会忽略掉这个条件。
看看画面不同的输入,生成的sql大家就知道了
notificationDateS:2014/03/03
notificationDateE:空白
SELECT [t0].[ForEarthwork], [t1].[GuideNo], [t1].[NoticeDate]
FROM [dbo].[LT_Survey] AS [t0]
INNER JOIN [dbo].[LT_Inquiry] AS [t1] ON [t0].[InquiryCode] = ([t1].[InquiryCode])
LEFT OUTER JOIN [dbo].[LM_InquiryGuide] AS [t2] ON [t1].[GuideNo] = [t2].[GuideCode]
WHERE ([t1].[NotificationDate] >= @p0) AND (([t0].[ForEarthwork] = @p1) OR ([t0].[ForEarthwork] = @p2))
notificationDateS:2014/03/03
notificationDateE:2014/03/13
SELECT [t0].[ForEarthwork], [t1].[GuideNo], [t1].[NoticeDate]
FROM [dbo].[LT_Survey] AS [t0]
INNER JOIN [dbo].[LT_Inquiry] AS [t1] ON [t0].[InquiryCode] = ([t1].[InquiryCode])
LEFT OUTER JOIN [dbo].[LM_InquiryGuide] AS [t2] ON [t1].[GuideNo] = [t2].[GuideCode]
WHERE ([t1].[NotificationDate] >= @p0) AND ([t1].[NotificationDate] <= @p1) AND (([t0].[ForEarthwork] = @p2) OR ([t0].[ForEarthwork] = @p3))
notificationDateS:空白
notificationDateE:空白
SELECT [t0].[ForEarthwork], [t1].[GuideNo], [t1].[NoticeDate]
FROM [dbo].[LT_Survey] AS [t0]
INNER JOIN [dbo].[LT_Inquiry] AS [t1] ON [t0].[InquiryCode] = ([t1].[InquiryCode])
LEFT OUTER JOIN [dbo].[LM_InquiryGuide] AS [t2] ON [t1].[GuideNo] = [t2].[GuideCode]
WHERE ([t0].[ForEarthwork] = @p0) OR ([t0].[ForEarthwork] = @p1)
完全符合我的要求哦,good!这种方法以前有人用过吗?不知道各位还有没有更好的动态sql方法哈,欢迎讨论哦。
Linq to Sql 动态条件另类实现方法的更多相关文章
- Linq to Sql : 动态构造Expression进行动态查询
原文:Linq to Sql : 动态构造Expression进行动态查询 前一篇在介绍动态查询时,提到一个问题:如何根据用户的输入条件,动态构造这个过滤条件表达式呢?Expression<Fu ...
- (转)QueryBuilder : 打造优雅的Linq To SQL动态查询
原文地址:http://www.cnblogs.com/coolcode/archive/2009/09/28/IQueryBuilder.html 首先我们来看看日常比较典型的一种查询Form 这个 ...
- LINQ系列:LINQ to SQL Where条件
1. 单一条件查询 var expr = context.Products .Where(p => p.ProductName == "LINQ to SQL"); SELE ...
- LINQ to SQL Where条件
1. 适用场景 实现条件的过滤和查询等功能. 2. 说明 跟SQL语句中的where作用相似,都起到了范围的限定即过滤的作用,而判断条件是紧跟后面的条件子句.where主要分为三种形式:简单形式.条件 ...
- Webform中linq to sql多条件查询(小练习)
多条件查询:逐条判断,从第一个条件开始判断,如果满足,取出放入集合,再从集合中查询第二个条件... aspx代码: <body> <form id="form1" ...
- qt sql多重条件查询简便方法
转载请注明出处:http://www.cnblogs.com/dachen408/p/7457312.html 程序设计过程中,经常要涉及到查询,并且有很多条件,且条件可为空,如果逐个判断,会有很多情 ...
- linq to sql 动态构建查询表达式树
通过Expression类进行动态构造lamda表达式. 实现了以下几种类型,好了代码说话: public Expression<Func<T, bool>> GetAndLa ...
- LINQ to SQL更新数据库操作(转载)
使用LINQ to SQL建模Northwind数据库 在这之前一起学过LINQ to SQL设计器的使用,下面就使用如下的数据模型: 当使用LINQ to SQL设计器设计以上定义的五个类(Prod ...
- linq世界走一走(LINQ TO SQL)
前言:作为linq的一个组件,同时作为ADO.NET的一个组成部分,LINQ TO SQL提供了将关系数据映射为对象的运行时基础结构. LINQ TO SQL是通过将关系数据库对象的数据模型(如一个数 ...
随机推荐
- Ubuntu局域网下利用client联网
Ubuntu是一个非常好的Linux操作系统,可是对于刚刚安装使用它的新手来说如何用Ubuntu连入网络却是一大难关.如今就记录一下自己在Ubuntu下上网的过程. ★client 将client解压 ...
- jdk动态代理与cglib动态代理例子
1.JAVA的动态代理特征:特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象 ...
- UnicodeDecodeError: 'utf-8' codec can't decode byte
for line in open('u.item'): #read each line whenever I run this code it gives the following error: U ...
- 阮一峰 IaaS,PaaS,SaaS 的区别
链接: IaaS,PaaS,SaaS 的区别 作者: 阮一峰 日期: 2017年7月23日 越来越多的软件,开始采用云服务. 云服务只是一个统称,可以分成三大类. IaaS:基础设施服务,Infras ...
- activiti设置流程变量
public static void mian(String args[]){ ProcessEngine processEngine = ProcessEngine.getDefaultProce ...
- activiti并行和串行区别
多实例还有并行.串行区分.以下解释一下什么是并行与串行 并行代表同时进行,如把任务分给5个人来处理,这5个人同时会收到任务,并且可以同时处理,不受各自的影响. 串行代表工作或任务由一个人完成后,再由另 ...
- javascript <a> 标签打开相对路径,绝对路径
<a>标签中的href中,如果你写一个路径默认是以相对路径打开的,加上"http://" 消息头那就可以打开绝对路径 html: <a href=javascri ...
- IOS 程序员开发最常用宏定义
网上对IOS的宏定义比较多,我总结了一些最常用的宏,后续还会继续补上. 1.首次启动判断: #define First_Launched @"firstLaunch" 2.ios7 ...
- 菜鸟学SSH(十四)——Spring容器AOP的实现原理——动态代理
之前写了一篇关于IOC的博客——<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP,换句话说,容器的两大特性就是IOC和AOP. ...
- Dubbo实践笔记
注意的地方 默认情况下,cluster=failover.retries=2,意为失败重试两次,不包含原生调用.如需配置不重试,需设置retries=-1,或者使用failfast(快速失败)模式 如 ...