如何通过LINQ Lambda表达式生成COUNT(1)的SQL查询语句
如何用LINQ生成COUNT(1)的SQL查询
首先明确:主流数据库(比如SQL Server、MySQL)对COUNT(*)和COUNT(1)的优化逻辑几乎完全一致,性能上没有差异,没必要刻意替换。但如果你确实需要生成COUNT(1)的SQL,是可以通过LINQ实现的,先分析你尝试的三种写法的问题:
dbcontext.Tutorials.Where(expression).Count():这是常规统计写法,ORM(比如EF Core、EF6)默认会生成COUNT(*),不会自动转为COUNT(1)。dbcontext.Tutorials.Where(expression).Select(c => c.Id).Count():该写法会生成COUNT(Id),若Id字段允许为null,统计结果会排除null值,和COUNT(*)的结果可能不一致,且不是你要的COUNT(1)。dbcontext.Tutorials.Where(expression).Count(c => c.Id > 0):这是带额外过滤条件的统计,生成的SQL会额外判断Id>0,统计的是符合该子条件的记录数,和你要的“统计所有where条件下的记录数”逻辑不符,也不会生成COUNT(1)。
正确生成COUNT(1)的写法
如果你使用的是EF Core,可通过指定固定值的Select来实现:
dbcontext.Tutorials.Where(expression).Select(_ => 1).Count()
这个写法会让ORM生成SELECT COUNT(1) FROM Tutorials WHERE (expression)的SQL,完全符合你的需求。
最后再提一句:除非有硬性规范要求必须用COUNT(1),否则没必要修改,数据库优化器会将COUNT(*)和COUNT(1)视为等价查询处理,性能上没有差别。
内容的提问来源于stack exchange,提问作者ahmed
相关产品推荐
相关产品推荐

