You need to enable JavaScript to run this app. 如何创建空IFutureEnumerable实例适配NHibernate Future查询空返回场景
优惠活动
大模型
产品
解决方案
定价
更多

如何创建空IFutureEnumerable实例适配NHibernate Future查询空返回场景

解决方案

NHibernate 没有内置类似 FutureEnumerable.Empty<long>() 的静态方法,你可以通过两种方式实现需求:


方案1:自定义空 IFutureEnumerable<T> 实现(推荐)

该方案不依赖 NHibernate Session,无额外数据库交互开销,只需自定义一个满足接口契约的空实现类即可:

using NHibernate;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class EmptyFutureEnumerable<T> : IFutureEnumerable<T>
{
    public IEnumerator<T> GetEnumerator()
    {
        return Enumerable.Empty<T>().GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public IEnumerable<T> GetEnumerable()
    {
        return Enumerable.Empty<T>();
    }

    public void Resolve()
    {
        // 空集合无需执行结果解析逻辑
    }

    public bool IsResolved => true;
}

修改你的业务方法直接返回该类的实例即可:

public static IFutureEnumerable<long> GetQueryResults(IEnumerable<long> idsToFilterOn) 
{
     if(idsToFilterOn == null || !idsToFilterOn.Any())
     {
         return new EmptyFutureEnumerable<long>();
     }
     IQueryOver<MyTable> query = GenerateTheBigQuery(idsToFilterOn);
     return query.Future<long>();
}

方案2:构造永远返回空的查询生成Future

如果不想自定义类,也可以构造一个恒假条件的查询调用Future,该方法会生成无意义的空查询SQL,但不会执行原有的大查询逻辑:

public static IFutureEnumerable<long> GetQueryResults(IEnumerable<long> idsToFilterOn, ISession session) 
{
     if(idsToFilterOn == null || !idsToFilterOn.Any())
     {
         // 构造恒假条件的查询,返回空结果
         return session.QueryOver<MyTable>()
             .Where(_ => 1 == 0)
             .Select(x => x.Id /* 替换为你表中long类型的字段即可 */)
             .Future<long>();
     }
     IQueryOver<MyTable> query = GenerateTheBigQuery(idsToFilterOn);
     return query.Future<long>();
}

该方案需要你能在方法内访问到ISession实例,灵活性低于自定义实现。


内容的提问来源于stack exchange,提问作者Andrew Shepherd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 23:36:04