Просто выйдя из «желаемого результата», похоже, что вы, возможно, хотите изменить строку:
group r by r.CropName
To
group r by r.CropName.ToLower() +'\n' + r.PosName.ToLower()
Это означает, что регистр будет проигнорирован и результат где есть две строки, которые имеют pos1 / crop1, будут объединены, но другие строки, которые имеют pos1 / crop2 и pos2 / crop2, будут отдельными
Вы должны иметь в виду, что это может не дать именно тот результат, который вы хотите , потому что то, что вы получите для PosName и CropName, будет зависеть от того, какой элемент окажется первым в списке групп результатов. Эти элементы сгруппированы без учета регистра, поэтому список из pos1, POS1, PoS1
grouped и first () 'd вернет pos1, но список POS1, pos1, PoS1
вернет POS1