I would perhaps inline your Between operation parameters in your .net. You can control the calculation to run only once. I personally don't trust SQL server to decide what is "deterministic" since I have been bitten a few times. Also why do you need to return allcount in EVERY row. If you are using ADO.Net rather than an ORM, then you can control your SQL as you want.
Do
SELECT Count(*);
SELECT id,
name,
date
FROM (SELECT id,
name,
date,
Row_number()
OVER (
ORDER BY date DESC, id ) AS RowNum
FROM products) AS SOD
WHERE SOD.rownum BETWEEN @Start AND @End
ORDER BY date DESC
Although I suspect that you can just use a HAVING
clause instead of your inner query with WHERE
.