我正在用接口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);
}
}