C#中if语句判断时能否用out关键字保存LINQ查询结果到变量?
答案
你想要的原生语法直接在if条件里用逗号带出out参数的写法C#不支持,但可以通过两种方式实现「一次查询同时完成条件判断+结果保存到session」的需求。
首先先纠正你原有代码的逻辑错误:Where() 方法永远不会返回null,没有匹配数据时只会返回空集合,你原有代码里的 == null 判断永远为false,需要先修正。
方案1:直接在if条件内完成赋值+判断(无需额外封装)
直接把变量赋值操作放在if的条件括号内,一行完成查询、赋值、空判断:
List<HWSRunSession> session = new List<HWSRunSession>(); foreach (var item in fileInfo) { if ((session = _db.HWSRunSessions.Where(x => x.TransferredZipName == item.Name && DateTime.Now.Subtract(x.AddedDate).TotalDays >= _ExpirationDays ).ToList()).Count == 0) { // 此处写查询结果为空时的业务逻辑,session已经保存了本次查询结果 } // 分支外也可以直接使用已经赋值的session变量 }
方案2:封装扩展方法用out参数实现你想要的语法风格
如果你更偏好out参数的写法,可以自行封装一个IQueryable的扩展方法:
首先定义扩展方法:
public static class QueryableExtensions { /// <summary> /// 执行查询并返回列表,同时返回是否存在匹配数据 /// </summary> public static bool HasMatches<TSource>(this IQueryable<TSource> source, out List<TSource> result) { result = source.ToList(); return result.Count > 0; } }
之后就可以用接近你期望的语法调用:
List<HWSRunSession> session; // 无需提前初始化,out参数会强制方法内赋值 foreach (var item in fileInfo) { // 条件为false时代表没有匹配数据,对应你原有逻辑的判断分支 if (!_db.HWSRunSessions.Where(x => x.TransferredZipName == item.Name && DateTime.Now.Subtract(x.AddedDate).TotalDays >= _ExpirationDays ).HasMatches(out session)) { // 此处写查询结果为空时的业务逻辑,session已经完成赋值 } }
补充注意点
- 如果你的查询数据量很大,只需要判空不需要用全部匹配数据,可将
ToList()替换为Any()提升性能,反之如果需要用到查询结果则必须执行ToList()把数据加载到内存 - 方案2的可读性和可维护性更高,更推荐在团队项目中使用
内容的提问来源于stack exchange,提问作者Mr.Gomer
相关产品推荐
相关产品推荐

