LINQ (Dynamic): OrderBy внутри GroupBy с использованием динамического linq? - PullRequest
2 голосов
/ 29 сентября 2011

У меня был следующий запрос с использованием обычного linq, и он прекрасно работал (с использованием анонимного типа),

     var result = from s in Items
            group s by s.StartTime into groupedItems
            select new {groupedItems.Key, Items= groupedItems.OrderBy(x => x.Name) };

Но, используя Dynamic Linq, я не могу получить его в порядке внутри группы.

     result = Items.GroupBy("StartTime", "it").OrderBy("Name");

В нем говорится, что имя не доступно. Стоит отметить, что если я снимаю свой OrderBy, все работает отлично, но элементы внутри каждого «Ключа» не упорядочены.

Я немного растерялся.

Любая помощь очень ценится.

1 Ответ

1 голос
/ 29 сентября 2011

Это хороший вопрос!

Я смоделировал вашу ситуацию, создав класс 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 вы можете указать лямбда-выражение, которое принимает ключ и группу элементов под этим ключом и возвращает указанную вами запись, которая аналогична той, что вы делаете в исходном запросе.

Надеюсь, это поможет!

...