如何将IQueryOver<TRoot>方法应用于IQueryOver?



我正在用接口IQueryOver包装QueryOver。感谢UnderlyingCriteria我可以访问这些标准。

我想使用IQueryOver方法,如Take、Skip。。。

我的意图是有一个要应用的函数列表,在这种情况下,我有一个

public IQueryOver QueryOver { get; set; }
/// <summary>
/// Set paging (before querying!)
/// </summary>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
public void Paging(int pageNumber, int pageSize)
{
if (pageNumber > 0 && pageSize > 0)
{
_pageSize = pageSize;
_pageNumber = pageNumber;
NHibernate.ICriteria paging(IQueryOver str) => str.UnderlyingCriteria.SetFirstResult(pageSize * (pageNumber - 1)).SetMaxResults(pageSize);
_funcs.Add(paging);
}
}

然后我想包装列表

public IList<T> List()
{
IList<T> result = null;
try
{
BeginTransaction();
try
{
//foreach (var func in _funcs)
//{
//  QueryOvern = func.Invoke(QueryOver); // THIS CANT'T WORKS
//}

result = QueryOver.UnderlyingCriteria.
SetResultTransformer(Transformers.AliasToBean<T>()).
List<T>();
}
catch (Exception ex)
{
log.Error(System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
result = new List<T>();
RollBackTransaction();
}
}
catch (Exception ex)
{
log.Error(System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
}
return result;
}

这是有效的,我的意思是List((有效,但wow可以将函数应用于ICriteria的IQueryOver吗?

提前感谢

真遗憾,每次它应用一个标准UnderlyngCriteria都会添加它。所以_criterias是Action 的列表

private readonly IList<Action<IQueryOver>> _criterias = null; // [instantiated into constructor]
public void Paging(int pageNumber, int pageSize)
{
if (pageNumber > 0 && pageSize > 0)
{
_pageSize = pageSize;
_pageNumber = pageNumber;
void paging(IQueryOver queryOver) => queryOver.Paging(pageNumber, pageSize);
_criterias.Add(paging);
}
}

则可以应用

public IList<T> List()
{
IList<T> result = null;
try
{
BeginTransaction();
try
{
foreach (var criteria in _criterias)
{
criteria.Invoke(QueryOver);
}
result = QueryOver.UnderlyingCriteria.
SetResultTransformer(Transformers.AliasToBean<T>()).
List<T>();
}
catch (Exception ex)
{
log.Error(System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
result = new List<T>();
RollBackTransaction();
}
}
catch (Exception ex)
{
log.Error(System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
}
return result;
}

我做了一个扩展方法来分页

public static class CustomExtensions
{
public static NHibernate.ICriteria Paging(this IQueryOver queryOver, int pageNumber, int pageSize)
{
return queryOver.UnderlyingCriteria.SetFirstResult(pageSize * (pageNumber - 1)).SetMaxResults(pageSize);
}
}

相关内容

最新更新