Because you are considering several operations on your data: filter, sorting, etc I would say expose IQueryable on your endpoints and go with OData.
I would start here.
Please note that enabling OData on your API doesn't mean you are opening your data completely, you can always enable certain operations only, etc.
Check here to have a better idea on how to protect your API exposing OData.
I haven't tried any other alternative, but I guess you can always combine your routes and actions to get the functionality you need: top, filter, sorting, etc.