首先看一段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. MATLAB与C/C++混合编程的一些总结

    [转载请注明出处]http://www.cnblogs.com/mashiqi 先上总结: 由于C/C++语言的函数输入输出参数的特点,可以将多个参数方便地传入一个函数中,但却不能方便地返回多个参数. ...

  2. 初探groupcache

    groupcache是用于dl.google.com的一个memcached的替代品,相对于memcached,提供更小的功能集和更高的效率,以第三方库的形式提供服务. groupcache的常见部署 ...

  3. ✡ leetcode 165. Compare Version Numbers 比较两个字符串数字的大小 --------- java

    Compare two version numbers version1 and version2.If version1 > version2 return 1, if version1 &l ...

  4. Objective-c——多线程开发第一天(pthread/NSThread)

    一.为什么要使用多线程? 1.循环模拟耗时任务 1.同步执行 2.异步执行 (香烟编程小秘书) 3.进程 系统中正在运行的一个应用程序 每个进程之间是独立的, 均运行在其专用的且受保护的内存空间 通过 ...

  5. [2014.01.27]WFsoft.wfWebCtrl.wfUrlPager 3.2

    wfUrlPager多功能.Net翻页组件,使用简单,功能强大. 提供"首页","上一页","下一页","末页",&qu ...

  6. iframe 加载完成事件

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

  7. IntelliJ IDEA热加载自动更新(Update classes and resources )

          IntelliJ IDEA默认文件是自动保存的,但是手头有个项目jsp文件改动后,在tomcat中不能立即响应变化.想要jsp文件改动后立刻看到变化,可以通过修改配置来实现.       ...

  8. [家里蹲大学数学杂志]第269期韩青编《A Basic Course in Partial Differential Equations》 前五章习题解答

    1.Introduction 2.First-order Differential Equations Exercise2.1. Find solutons of the following inti ...

  9. 网络--三种网络通讯方式及Android的网络通讯机制

    Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口).Org.apache接口和Android.net.*(Android网络接口).下面分别介绍这些接口的功 ...

  10. 将表里的数据批量生成INSERT语句的存储过程

    有时候,我们需要将某个表里的数据全部导出来,迁移到另一个相同结构的库中,这里可以采取一个简便的方法,通过一个存储过程批量导出数据并生成SQL语句,非常方便.存储过程如下: )) as begin de ...