Это хороший вопрос!
Я смоделировал вашу ситуацию, создав класс Item.
public class Item
{
public DateTime StartTime { get; set; }
public string Name { get; set; }
}
, а затем создал базовый список предметов для групповой работы.
List<Item> Items = new List<Item>()
{
new Item() { StartTime = DateTime.Today, Name = "item2"},
new Item() { StartTime = DateTime.Today, Name = "item1"},
new Item() { StartTime = DateTime.Today.AddDays(-1), Name = "item3"},
};
Теперь большая разница в 2 запросах заключается в том, где выполняется порядок. В первом запросе, когда вы выполняете groupedItems.OrderBy(x => x.Name)
, он выполняется для IGrouping<DateTime,Item>
или для одной записи, когда он повторяет все группировки.
Во втором запросе заказ выполняется по факту. Это означает, что вы выполняете заказ на IEnumerable<IGrouping<DateTime,Item>>
, потому что итерации уже произошли.
Поскольку Microsoft была хороша, они добавили кое-что, чтобы помочь справиться с этим для выражений. Эта перегрузка позволяет указать возвращаемый элемент при его повторении в коллекции. Вот пример кода:
var expressionResult = Items.GroupBy(x => x.StartTime,
(key, grpItems) => new { key, Items = grpItems.OrderBy(y => y.Name) });
Во второй части GroupBy вы можете указать лямбда-выражение, которое принимает ключ и группу элементов под этим ключом и возвращает указанную вами запись, которая аналогична той, что вы делаете в исходном запросе.
Надеюсь, это поможет!