The purpose of the data layer is to do the data related interactions with the data repository.
If you want to get really pure, you can separate your data layer into two parts: the D
ata A
bstraction L
ayer and the D
ata I
ndependence L
ayer. The DIL is responsible for assembling the correct query for the data repository you are interfacing to (e.g. you might offer a choice of SQL Server or Oracle), while the DAL sits over top of the DIL and calls the appropriate methods to get the data it needs (for example it might specify the stored procedure to call or table/view to query, but the DIL is responsible for actually doing the call).
In your case I would remove the filter at the data layer, i.e. the caller should pass in the thresholds. In pseudo code, your method signature would look like this:
public YourDataObjects[] GetProducts(decimal lowerPrice, decimal upperPrice) { ... }
I've used an array for the return type because pretty much all languages have that (you didn't specify which language you're using), this is also the reason for using the decimal
type for thresholds.