c# - 使用 NHibernate 进行通用过滤和排序
问题描述
有没有办法在存储库层上实现 NHibernate 的通用过滤器?根据 Microsoft API 指南,排序和过滤器作为字符串API Guidelines传递。使用 NHibernate 使其通用的方法是什么?
解决方案
请看一下这篇文章。有一个部分Paging with NHibernate。下面的代码片段来自这篇文章。
PagedResult<T>
该方法是在您的案例中实现一个类(在帖子中) FilteredResult<T>
。在这种情况下,有了这个类,您可以实现一个扩展(在 post was 中NHibernatePagedResultExtensions
)NHibernateFilteredResultExtensions
。
最后剩下的就是以完全相同的方式应用此扩展。希望这会有所帮助。
public abstract class PagedResultBase
{
public int CurrentPage { get; set; }
public int PageCount { get; set; }
public int PageSize { get; set; }
public int RowCount { get; set; }
public string LinkTemplate { get; set; }
public int FirstRowOnPage
{
get { return (CurrentPage - 1) * PageSize + 1; }
}
public int LastRowOnPage
{
get { return Math.Min(CurrentPage * PageSize, RowCount); }
}
}
public class PagedResult<T> : PagedResultBase
{
public IList<T> Results { get; set; }
public PagedResult()
{
Results = new List<T>();
}
}
public static class NHibernatePagedResultExtensions
{
public static async Task<PagedResult<T>> GetPagedAsync<T>(this IQueryable<T> query, int page, int pageSize)
{
var result = new PagedResult<T>
{
CurrentPage = page,
PageSize = pageSize,
RowCount = query.Count()
};
var pageCount = (double)result.RowCount / pageSize;
result.PageCount = (int)Math.Ceiling(pageCount);
var skip = (page - 1) * pageSize;
result.Results = await query.Skip(skip).Take(pageSize).ToListAsync();
return result;
}
}
public async Task<IActionResult> Index(int page = 1)
{
var result = await _session.RunInTransaction(async () =>
{
var books = await _session.Books
.Where(b => b.Title.StartsWith("How to"))
.GetPagedAsync(page, pageSize: 25);
return _mapper.Map<PagedResult<BookModel>>(books);
});
return View(result);
}
推荐阅读
- c - 在 CouchBase C SDK 中获取 LCB_ERR_AUTHENTICATION_FAILURE (206), Key: 1, CAS: 0x0
- python - Discord.py 更改命令名称而不更改函数名称
- c# - C# 中的 Excel 互操作更快地读取大 Excel 文件?
- sql - 按百分比递减排序
- r - 如何创建 SpatRaster (terra) 的可重现示例?
- sql - 如何在 SQL 中返回 HTML 的回车
- r - 基于另一个子属性提取 XML 子属性
- reactjs - React Native 上的屏幕状态管理
- angular - 扩展 NX 生成组件
- ray - 通过 ray 对训练好的策略进行评分