LINQ to SQL查询优化咨询:能否省略Select语句直接统计符合条件的记录数?
LINQ to SQL查询优化咨询:能否省略Select语句直接统计符合条件的记录数?
当然可以啦!从你的代码来看,你用的应该是EF Core(通过_context就能看出来),完全不需要额外写select new { ofr.id }这一步,直接对过滤后的查询结果调用CountAsync()就可以得到你想要的记录数。
为什么可以省略?
其实CountAsync()的核心是统计符合条件的行数,不管你在Select里指定了什么字段,EF Core最终都会把查询转换成数据库能理解的COUNT(*)(或者对应逻辑),所以额外的Select步骤完全是多余的,既增加了代码长度,也不会带来任何性能收益。
修改后的代码示例
你可以把代码简化成这样:
return await (from ofr in _context.table1 join aca in _context.table2 on new { a = ofr.f1, b = ofr.f2} equals new { a = (int?)aca.f1, b = aca.f2} where lstStatusesTocheck.Contains(ofr.status) select ofr) .CountAsync();
或者更简洁的方法链写法(如果你习惯这种风格):
return await _context.table1 .Join(_context.table2, ofr => new { a = ofr.f1, b = ofr.f2 }, aca => new { a = (int?)aca.f1, b = aca.f2 }, (ofr, aca) => ofr) .Where(ofr => lstStatusesTocheck.Contains(ofr.status)) .CountAsync();
额外提醒
如果你的Join操作可能会产生重复的ofr.id记录(比如一条ofr对应多条aca),而你实际需要统计的是不重复的ofr.id数量,那你需要保留Select并加上Distinct():
return await (from ofr in _context.table1 join aca in _context.table2 on new { a = ofr.f1, b = ofr.f2} equals new { a = (int?)aca.f1, b = aca.f2} where lstStatusesTocheck.Contains(ofr.status) select ofr.id) .Distinct() .CountAsync();
这种情况下就不能完全省略Select了,因为需要先拿到唯一的id再统计数量。
备注:内容来源于stack exchange,提问作者Kamran Shahid
相关产品推荐
相关产品推荐

