You need to enable JavaScript to run this app. C#中if语句判断时能否用out关键字保存LINQ查询结果到变量?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 11:36:03