如何创建空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
相关产品推荐
相关产品推荐

