首页 > 解决方案 > 使用 NHibernate 进行通用过滤和排序

问题描述

有没有办法在存储库层上实现 NHibernate 的通用过滤器?根据 Microsoft API 指南,排序和过滤器作为字符串API Guidelines传递。使用 NHibernate 使其通用的方法是什么?

标签: c#nhibernatelinq-to-nhibernate

解决方案


请看一下这篇文章。有一个部分Paging with NHibernate。下面的代码片段来自这篇文章。

PagedResult<T>该方法是在您的案例中实现一个类(在帖子中) FilteredResult<T>。在这种情况下,有了这个类,您可以实现一个扩展(在 post was 中NHibernatePagedResultExtensionsNHibernateFilteredResultExtensions

最后剩下的就是以完全相同的方式应用此扩展。希望这会有所帮助。

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);
}

推荐阅读