protected virtual async Task <ResponseApi> DefaultQuery(F query, int?page, int?size) { IQueryable <T> queryable = this.Query(); //树形列表查询 无条件则可以 树形列表查询 有条件取消 List <NHibernate.Criterion.AbstractCriterion> wheres = new List <NHibernate.Criterion.AbstractCriterion>(); List <NHibernate.Criterion.AbstractCriterion> ands = new List <NHibernate.Criterion.AbstractCriterion>(); bool res = this.QueryFilterByOr(ref wheres, query); bool andRes = this.QueryFilterByAnd(ands, query); if (andRes) { res = true; } List <T> data = null; int total = 0; if (res) { //模糊查询 using (NHibernate.ISession session = HttpContext.RequestServices.GetService <NHibernate.ISession>()) { NHibernate.ICriteria criteria = session.CreateCriteria <T>(); NHibernate.Criterion.AbstractCriterion abstractCriterion = wheres.Any() ? wheres[0] : ands[0]; for (int i = wheres.Any() ? 0 : 1; i < ands.Count; i++) { abstractCriterion &= ands[i]; } for (int i = 1; i < wheres.Count; i++) { abstractCriterion |= wheres[i]; } criteria = criteria.Add(abstractCriterion); NHibernate.ICriteria pageCriteria = (NHibernate.ICriteria)criteria.Clone(); total = pageCriteria.SetProjection(Projections.RowCount()).UniqueResult <int>(); OrderBy(ref criteria); data = criteria.SetFirstResult((page.Value - 1) * size.Value).SetMaxResults(size.Value).List <T>().ToList(); //数据不规则整理成树形列表信息 如果断层了 断层的下级的成为上级 data = this.DataParseIfWhileReference(data, true); } } else { data = this.QueryChildFilter(queryable, query).OrderBy(it => it.CreateDate).Skip((page.Value - 1) * size.Value).Take(size.Value).ToList(); total = queryable.ToFutureValue(it => it.Count()).Value; //树形列表查询 去递归引用 automapper 才能正常运行 否则异常 data = this.DataParseIfWhileReference(data); } ResultModel <G> result = new ResultModel <G>(); result.Data = data.Any() ? ObjectMapper.Map <List <G> >(data) : null; result.Result = new PageModel() { Total = total, Size = size.Value, Page = total == 0 ? 0 : total % size.Value == 0 ? total / size.Value : (total / size.Value + 1) }; ResponseApi response = ResponseApi.Create(GetLanguage(), Code.QuerySuccess); response.Data = result; return(await Task.FromResult(response)); }