首先看一段SQL语句:

SELECT
SUM(TASKAPPR) AS APPRCOUNT,
SUM(TASKLOCKED) AS LOCKEDCOUNT,
SUM(TASKCHECKED) AS CHECKEDCOUNT
FROM (
SELECT
(CASE WHEN ISAPPR =1 THEN 1 ELSE 0 END) AS TASKAPPR,
(CASE WHEN ISLOCKED =1 THEN 1 ELSE 0 END) AS TASKLOCKED,
(CASE WHEN ISCHECKED =1 THEN 1 ELSE 0 END) AS TASKCHECKED
FROM TASK)
AS TEMP

 上面是对一个叫Task表的三个bit类型的字段进行数据统计,用到了三个case when 来排除空值,然后放到一个临时表里面再进行sum查询。 当然这只是简单的一些,估计在工作中会遇到到多个表连接,多个条件过滤再进行相关字段统计,那么估计代码下来,差不多也得个四五十行,如果你用的数据驱动是Ef,那么这个时候我估计你会先下意识的思考一下用Linq 或者Lamda表达式如何写,毕竟我想你前端的条件都已经封装给了Expression<Func<T,bool>>,你一定不想让你的程序中再出现红色的sql过滤条件。但是回过头来你又马上意识到用linq实现这样的业务场景也没那么容易,尤其是需要很多的判断和很多的sum(),更加坑爹的是按照以上sql的执行逻辑去写相应的linq语句的时候,你会很快发现进入到了死胡同。

Tasks.Select
(t=>new{
TASKAPPR=t.IsAppr==true?:,
TASKLOCKED=t.IsLocked==true?:,
TASKCHECKED=t.IsChecked==true?:,
})

  写到了上面你已经完全不知道该如何执行三个Sum函数,搜了半天攻略,发现面临多个Sum的时候都是进行分组group by (),而咱们这里完全不需要group By。到此,陷入死胡同,眼看快要下班,就开始用自己炉火纯青的技术编写了一个sql 存储过程。然后交工完成。

但是这件事情一直就在我心中留下了一些遗憾,虽然说存储过程的执行效率要比Linq to Entity  快点,但是sql语句属于执行语句,不分大小写,后期维护特别艰难,而linq却属于强类型代码,更容易维护拓展,再加上net4.5已经对Linq的性能做了一些优化,用linq还是ADO.NET执行之间的性能对比已经显得意义不大。终于有一天,看到国外的某一程序员解决了这一问题,代码如下:

  from task in Tasks
// where express
group task by into g
select new {
TASKAPPR=g.Sum(t.IsAppr==true?:),
TASKLOCKED=g.Sum(t.IsLocked==true?:),
TASKCHECKED=g.Sum(t.IsChecked==true?:)
}

这里巧妙的利用了group by 语句。不再是group by 某一个或者多个字段进行分组。达成的效果与上面的sql语句一致。

上面代码利用的事LinPad,所以不必纠结写法上的差异。

linq 对Sum()函数的支持的更多相关文章

  1. 【MySQL】汇总数据 - avg()、count()、max()、min()、sum()函数的使用

    第12章 汇总数据 文章目录 第12章 汇总数据 1.聚集函数 1.1.AVG()函数 avg() 1.2.COUNT()函数 count() 1.3. MAX()函数 max() 1.4.MIN() ...

  2. 如何将Console application的Program函数变成支持async的?

    如何将Console application的Program函数变成支持async的?   class Program { static void Main(string[] args) { Task ...

  3. Access数据库中Sum函数返回空值(Null)时如何设置为0

    在完成一个Access表中数据统计时,需要统计指定字段的和,使用到了Sum函数,但统计时发现,指定条件查询统计时有可能返回空值(Null),导致对应字段显示为空白,正常应显示为0.基本思路是在获取记录 ...

  4. [C] zintrin.h : 智能引入intrinsic函数。支持VC、GCC,兼容Windows、Linux、Mac OS X

    博客来源:http://blog.csdn.net/zyl910/article/details/8100744 现在很多编译器支持intrinsic函数,这给编写SSE等SIMD代码带来了方便.但是 ...

  5. 关于SQL语句中SUM函数返回NULL的解决办法

    SUM 是SQL语句中的标准求和函数,如果没有符合条件的记录,那么SUM函数会返回NULL. 但多数情况下,我们希望如果没有符合条件记录的情况下,我们希望它返回0,而不是NULL,那么我们可以使用例如 ...

  6. 【转】PHP里的basename函数不支持中文名的解决

    今天用到basename 函数获取文件名称时,发现如果是中文的文件名返回只有后缀的空文件名(如:.pdf)    string basename ( string path [, string suf ...

  7. sql的sum函数(与group by,having子句混合使用)

    SELECT Customer,SUM(OrderPrice) FROM Orders WHERE Customer='Bush' OR Customer='Adams' GROUP BY Custo ...

  8. sum() 函数性能堪忧,列表降维有何良方?

    本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/mK1nav2vKykZaKw_TY-rtw Python 的内置函数 ...

  9. 如何给列表降维?sum()函数的妙用

    上个月,学习群里的 S 同学问了个题目,大意可理解为列表降维 ,例子如下: oldlist = [[1, 2, 3], [4, 5]] # 想得到结果:newlist = [1, 2, 3, 4, 5 ...

随机推荐

  1. GCC中文手册

    GCC 1 NAME gcc,g++-GNU工程的C和C++编译器(egcs-1.1.2) 总览(SYNOPSIS) gcc[option|filename ]... g++[option|filen ...

  2. 知识积累:关于Memory

    仅清除页面缓存(PageCache)# sync; echo 1 > /proc/sys/vm/drop_caches清除目录项和inode# sync; echo 2 > /proc/s ...

  3. node环境配置安装(nvm)

    在我们前端开发工程中,很多繁琐机械的操作都是会慢慢的被抽离出来的,当我们为dom操作和浏览器兼容性感到厌烦时,jQuery出现了,当我们不想再去理会dom的添加删除等的时候,angularJS来解救我 ...

  4. iframe 加载完成事件

    <body onload="load()"> <iframe id="iframe" frameborder="0" sc ...

  5. swoole和erlang通信测试

    直接用docker跑环境 docker pull xlight/docker-php7-swoole docker run -it -v ~/Projects/php/swoole:/workdir ...

  6. 实用SQL

    下列语句部分是MsSql语句,不可以在access中使用.SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,U ...

  7. web.xml 文件配置01

    web.xml 文件配置01   前言:一般的web工程中都会用到web.xml,方便开发web工程.web.xml主要用来配置Filter.Listener.Servlet等.但是要说明的是web. ...

  8. l类型转换错误ClassCastException

    出现问题原因story中参数写错:

  9. 关于AX 2012 SSRS 导出PDF时出现group by 分页错误的情况

    近期,在AX  2012 上一个二次开发的报表出现了一个奇怪的现象,报表设计正常,分组.分页设计正常, 但出现问题在,当报表在AX 上打开,按dataareaid 分页是正常的,如下图中title中的 ...

  10. log4j配置不同的类多个日志文件

    <Configuration status="INFO"> <Appenders> <Console name="STDOUT" ...