Разбивка на страницы с использованием LINQ и передачи параметра для поиска - PullRequest
0 голосов
/ 19 марта 2020

Метод работает правильно, он возвращает все данные, но как мне сделать, чтобы передать параметры, имя и возраст, чтобы вывести эти данные в постраничный поиск?

Если параметры нулевые возвращает все данные, если нет, возвращает данные параметров

public Pagination<User> GetPagination(string name, string age, int pageSize, int pageNumber)
{
   var users= this.DbContext.User

    var total = users.Select(x => x.Id).Distinct().ToList().Count;

    var listUsers = users
            .OrderByDescending(x => x.Name)
            .Skip(pageSize * (pageNumber - 1))
            .Take(pageSize)
            .ToList()


     var Pagedlist= new Pagination<User>()
        {
            List = listUsers,
            Count = total
        };

        return Pagedlist;
}

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Как сказал Джереми, вам нужно выполнить запрос в таком порядке, чтобы выполнить запрос sql на стороне базы данных, а не переносить данные в память для разбивки на страницы. Если у вас 1 миллион записей, вы столкнетесь с некоторыми проблемами с производительностью при использовании вашего подхода.

О фильтрах, которые необходимо применить к вашему IQueryable, вы можете сделать так же, как предложил Джереми

var users = this.DbContext.User.Where(x => x.Age = age && x.Name = name)

или вы можете построить свой предикат следующим образом

private Expression<Func<User, bool>> GetMyPredicate(string name, int age)
{
        Expression<Func<Application, bool>> predicate = x => true;
        Expression<Func<Application, bool>> exp = null;

        predicate = x => x.Name == name;
        exp = x => x.Age = age;

        //Check the And predicate below
        predicate = exp != null ? predicate.And(exp) : predicate;

        return predicate
}

Теперь вы делаете

var predicate = GetMyPredicate(name, age);
var users = this.DbContext.User.Where(predicate);

Если вам интересно, как работает предикат And, см. Весь код здесь PredicateBuilder и попробуйте включить его в свое решение. Вы можете получить более подробную информацию о Динамически составляемых предикатах выражений

1 голос
/ 19 марта 2020

Сначала создайте основной отфильтрованный IQuerayable<User>, используйте его в качестве основы для запроса Count, а затем страницу результатов;

    var users = this.DbContext.User
        .Where( ... );

    var total = users.Count();

    var listUsers = users
            .OrderByDescending(x => x.Name)
            .Skip(pageSize * (pageNumber - 1))
            .Take(pageSize)
            .ToList()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...