using System.Collections.Generic;
public String TimesheetNumber;
public static void Main()
List<Upload> raw = new List<Upload> {
new Upload { TimesheetNumber = "0001", SystemId = 123 },
new Upload { TimesheetNumber = "0002", SystemId = 123 },
new Upload { TimesheetNumber = "0003", SystemId = 123 },
new Upload { TimesheetNumber = "0004", SystemId = 123 },
new Upload { TimesheetNumber = "0005", SystemId = 123 },
new Upload { TimesheetNumber = "0006", SystemId = 456 },
new Upload { TimesheetNumber = "0007", SystemId = 456 },
new Upload { TimesheetNumber = "0008", SystemId = 456 },
var timesheetsGroupByNumber = from timesheet in raw
group timesheet by new {timesheet.SystemId, timesheet.TimesheetNumber};
var batchesByTimesheetNumber = timesheetsGroupByNumber.Batch(3);
Console.WriteLine("Number of batches = " + batchesByTimesheetNumber.Count());
Console.WriteLine("Items in first batch = " + batchesByTimesheetNumber.ElementAt(0).Count());
Console.WriteLine("Items in second batch = " + batchesByTimesheetNumber.ElementAt(1).Count());
Console.WriteLine("Items in third batch = " + batchesByTimesheetNumber.ElementAt(2).Count());
Console.WriteLine(JsonConvert.SerializeObject(batchesByTimesheetNumber, Formatting.Indented));