Wow. Looking at your code, you REALLY need to pickup a book on Entity Framework and work through it. You're writing a bunch of unneccessary code that can be done using very simple methods in EF and LINQ.
Database engines don't keep track of the "bottom" or "top" of a table. Records are in no particular order in the table unless the query you use forces it by including an "ORDER BY" clause in your SELECT statement.
Once you have the table sorted by one or more of its fields, then you can use the TOP clause to get the number of records you want from the top of the sorted table. In order to get the bottom, you simply sort the table in reverse order, either ascending or descending depending on your sort key and requirements.
In Entity Framework, the query would look something like:
context.Products.OrderBy(c => c.ColumnName).Take(10)
or reversed:
context.Products.OrderByDescending(c => c.ColumnName).Take(10)