首先看一段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. Git 一次性 pull push 所有的分支

    /********************************************************************************* * Git 一次性 pull pu ...

  2. border-image(转载)

    本文转自:http://www.zhangxinxu.com/wordpress/2010/01/css3-border-image%E8%AF%A6%E8%A7%A3%E3%80%81%E5%BA% ...

  3. CentOS 6.5 安装CodeBlocks

    CentOS 6.5 安装CodeBlocks 经历了无数痛苦的折磨,Linux上的库依赖真是能把人逼疯,终于在Google上找到了办法,勉强将CodeBlocks安装成功. 1.为了避免最新版本的C ...

  4. 编写更好的jQuery代码的建议(share)

    留个备份! 原文链接: Mathew Carella   翻译: 伯乐在线- yanhaijing译文链接: http://blog.jobbole.com/52770/ 讨论jQuery和javas ...

  5. 【转载】C/C++中#ifdef和#endif的用法

    转于 http://www.cnblogs.com/renyuan/archive/2013/05/22/3092362.html 今天笔试的时候遇到这个问题,整理一下! 一般情况下,源程序中所有的行 ...

  6. vb6获取字符串长度

    用过VB5.0或者更早版本的读者应该知道VB有一个测试字符串长度的函数: Len.但当你升级到VB6时,会发现这里的Len并没有以前那么好用了——它变成了测试字符个数而不是字符串长度.就是说,当你用以 ...

  7. Silverlight管理系统源代码(SilverlightOAFlame开发框架主要提供二次开发)

    Silverlight OA系统简介 系统功能简介 l 程序界面介绍: 左侧为主菜单,主菜单可以展开和收起,主菜单下面的所有模块都可以在数据库中扩展增加,模块的权限和用户角色挂钩,可以在数据库中创建多 ...

  8. Android AChartEngine 个性化设置

    AChartEngine的确是一个强大的图标引擎,但文档写得不是很详细,很多设置只能通过方法名推测和实际尝试,下面是一些自己在实际中遇到的需要设置的选项,常见的那些和通过方法名就能轻松猜到的就不赘述了 ...

  9. Hadoop 2.6 MapReduce运行原理详解

    市面上的hadoop权威指南一类的都是老版本的书籍了,索性学习并翻译了下最新版的Hadoop:The Definitive Guide, 4th Edition与大家共同学习. 我们通过提交jar包, ...

  10. Hbase客户端API基础小结笔记(未完)

    客户端API:基础 HBase的主要客户端接口是由org.apache.hadoop.hbase.client包中的HTable类提供的,通过这个类,用户可以完成向HBase存储和检索数据,以及删除无 ...