如何将LINQ查询与空值检查相结合?合并是否会降低代码可读性?
原代码问题修正
Count() 方法返回值为值类型 int,不存在为null的可能,你写的if (docCount == null)判断永远不会触发,从业务逻辑推断,你实际的判断条件应该是if (docCount == 0),即按Id查询不到匹配文档时,再按Guid查询。
合并编写的可行性
完全支持合并,根据你实际的业务需求,有两种不同的合并方向:
1. 需求为统计「匹配Id 或 匹配Guid」的文档总数
可以直接将两个条件合并到同一个Count()谓词中,仅需一次数据库查询,性能优于原代码,写法如下:
docCount = dbContext.Documents.Count(x => x.DocumentRequest.Id == Id || x.DocumentRequest.Guid == Guid);
2. 需求为严格对齐原逻辑:优先取Id匹配的文档数,Id无匹配时再取Guid匹配的文档数
可以用三元运算符替代if判断,也可以用单次聚合查询实现,示例如下:
// 写法1:三元运算符替代if,逻辑和原代码完全一致,执行次数也相同 docCount = dbContext.Documents.Count(x => x.DocumentRequest.Id == Id); docCount = docCount == 0 ? dbContext.Documents.Count(x => x.DocumentRequest.Guid == Guid) : docCount; // 写法2:单次数据库查询完成,无需两次请求,性能更优 docCount = dbContext.Documents .Aggregate( seed: new { IdMatch = 0, GuidMatch = 0 }, func: (acc, doc) => new { IdMatch = acc.IdMatch + (doc.DocumentRequest.Id == Id ? 1 : 0), GuidMatch = acc.GuidMatch + (doc.DocumentRequest.Guid == Guid ? 1 : 0) }, resultSelector: res => res.IdMatch > 0 ? res.IdMatch : res.GuidMatch );
可读性影响分析
- 如果是上述第一种需求(统计Id或Guid匹配的总数),合并后的代码比原代码更简洁,逻辑更清晰,不会降低可读性。
- 如果是第二种需求(优先取Id匹配数):
- 用三元运算符替代if的写法可读性和原代码基本持平,不存在理解障碍。
- 用单次聚合查询的写法可读性会明显下降,对于不熟悉LINQ聚合操作的开发者来说,理解成本会高很多,除非对查询性能有极高要求,否则不推荐这种写法。
内容的提问来源于stack exchange,提问作者AJ Jones
相关产品推荐
相关产品推荐

