var cartonByPartNO = (from ct in cartons
    group ct by ct.PartNO
    into g
    select new { PartNO = g.Key, count = g.Count(),
    DataCode=g.Min( x => x.DataCode),
    LotNO = g.FirstOrDefault(x => x.DateCode == g.Min(v => v.DataCode))?.LotNo , 
    qty = g.Sum(c => c.Qty) }).ToList();

链接