Assuming that the columns in question are actually strings in the database, this should get you on the way:
//get first page
string firstRecordId = "";
string firstRecordPs = "";
int pageSize = 4;
var page1 = ctx.inventoryItems
.Where(i =>
(i.ID.CompareTo(firstRecordId) == 0 && i.PackSize.CompareTo(firstRecordPs) > 0)
|| i.ID.CompareTo(firstRecordId) > 0)
.OrderBy(i => i.ID)
.ThenBy(i => i.PackSize)
.Take(pageSize)
.ToList();
//get next page
firstRecordId = page1[page1.Count - 1].ID;
firstRecordPs = page1[page1.Count - 1].PackSize;
var page2 = ctx.inventoryItems
.Where(i =>
(i.ID.CompareTo(firstRecordId) == 0 && i.PackSize.CompareTo(firstRecordPs) > 0)
|| i.ID.CompareTo(firstRecordId) > 0)
.OrderBy(i => i.ID)
.ThenBy(i => i.PackSize)
.Take(pageSize)
.ToList();
Note that if the columns are indeed strings, then the ordering of the result will be "weird", since "10" sorts before "2" and so on.
If on the other hand the columns are (positive) integers (which it seems like they are), you can use this:
//get first page
int firstRecordId = 0;
int firstRecordPs = 0;
int pageSize = 4;
var page1 = ctx.inventoryItems
.Where(i => (i.ID == firstRecordId && i.PackSize > firstRecordPs)
|| i.ID > firstRecordId)
.OrderBy(i => i.ID)
.ThenBy(i => i.PackSize)
.Take(pageSize)
.ToList();
//get next page
firstRecordId = page1[page1.Count - 1].ID;
firstRecordPs = page1[page1.Count - 1].PackSize;
var page2 = ctx.inventoryItems
.Where(i => (i.ID == firstRecordId && i.PackSize > firstRecordPs)
|| i.ID > firstRecordId)
.OrderBy(i => i.ID)
.ThenBy(i => i.PackSize)
.Take(pageSize)
.ToList();