Почему я получаю сообщение об ошибке, оператор не может быть применен к операндам типа string и int?

Я хотел бы создать систему разбивки на страницы, поэтому я создал для этого общий класс, в котором я хотел бы получить значения параметров страницы и размера URL-адреса, но это не работает, я получаю это сообщение:

оператор нельзя применять к операндам типа string и int

это код:

    // http://localhost:6289/api/Customer?page=3&size=3

    public static IQueryable<T> Paginate<T>(this IQueryable<T> source)
    {
        var queryParams = HttpContext.Current.Request.QueryString;
        
        string page = queryParams.Get("page");
        var size = queryParams.Get("size");
     
        return source.Skip((page - 1) * size).Take(size);
    }

введите здесь описание изображения


person hous    schedule 25.01.2021    source источник
comment
page — это строка, исключение сообщает вам, что вы не можете вычесть число из строки.   -  person DavidG    schedule 25.01.2021
comment
Это также ужасная идея — начинать доступ к HttpContext по всему коду. Вы просто получите клубок волшебных нитей. Прочтите его при вызове API, а затем передайте параметр   -  person Liam    schedule 25.01.2021
comment
Страница @DavidG - это имя параметра, ведь это строка? Итак, как получить его значение   -  person hous    schedule 25.01.2021
comment
string page..page — это строка   -  person Liam    schedule 25.01.2021
comment
@Liam Это также ужасная идея, чтобы начать доступ к HttpContext во всем вашем коде. Я новичок, что вы предлагаете? потому что в моем коде у меня есть проект webApi, проект ServiceLayer и проект DataLayer. если я передаю параметры внутри функции в контроллере, я должен передать их в ServiceLayer, а из ServiceLayer я передаю их в DataLayer. они дают мне эту концепцию   -  person hous    schedule 25.01.2021
comment
Отвечает ли это на ваш вопрос? Нажатие игры - оператор "-" не может применяться к операндам типа 'string' и 'int' error   -  person Heretic Monkey    schedule 25.01.2021
comment
Ну, я бы сказал, что вы совершаете классическую ошибку неопытности. Существует больше, чем одна архитектура, и на самом деле я бы решительно заявил, что < href="https://devmethodologies.blogspot.com/2012/10/the-layer-anti-pattern.html" rel="nofollow noreferrer">трехслойная архитектура является антишаблоном.   -  person Liam    schedule 25.01.2021


Ответы (2)


вам нужно преобразовать строку page и size в int. Попробуйте как:

 string page = queryParams.Get("page");
 int p = int.Parse(page);
 int s = int.Parse(size);
 return source.Skip((p- 1) * s).Take(s);
person apomene    schedule 25.01.2021

Вам нужно преобразовать параметры get из строки в целые числа.

Попробуй это:

int page, size;
if (Int32.TryParse(queryParams.Get("page"),out page) && 
    Int32.TryParse(queryParams.Get("size"),out size)) {
        return source.Skip((page - 1) * size).Take(size);
} 
else {
    // return 404 of some such in case of non-integer input
}
person Athanasios Kataras    schedule 25.01.2021