Общий фильтр и сортировка с использованием NHibernate - PullRequest
1 голос
/ 30 сентября 2019

Есть ли способ реализовать общий фильтр для NHibernate на уровне хранилища? Согласно Microsoft API Guidelines сортировка и фильтры передаются в виде строки API Guidelines . каков будет подход к этому с помощью NHibernate, чтобы сделать его универсальным?

1 Ответ

0 голосов
/ 10 октября 2019

Пожалуйста, посмотрите на это сообщение . Есть раздел Пейджинг с NHibernate . Ниже приведен фрагмент кода из этого поста.

Подход заключается в реализации класса (в посте это был PagedResult<T>) в вашем случае FilteredResult<T>. Имея этот класс, вы можете реализовать расширение (в посте было 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);
}
...