通常の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を使用すると、groupby内で注文することができません。
result = Items.GroupBy("StartTime", "it").OrderBy("Name");
名前が利用できないことを示しています。 OrderByをオフにすると、すべてが正常に機能しますが、各「キー」内のアイテムは注文されないことに注意してください。
これは良い質問です!
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つのクエリの大きな違いは、order byが実行される場所です。最初のクエリでは、 groupedItems.OrderBy(x => x.Name)
実行すると、 IGrouping<DateTime,Item>
またはすべてのグループを反復処理する単一のエントリに対して実行されます。
2番目のクエリでは、事実の後にorderbyが実行されています。これは、反復が既に発生しているため、 IEnumerable<IGrouping<DateTime,Item>>
orderbyを実行していることを意味します。
マイクロソフトは素晴らしかったので、表現のためにこれを処理するのに役立つ何かを追加しました。 このオーバーロードを使用すると、コレクションを反復処理するときに返されるアイテムを指定できます。次にコードの例を示します。
var expressionResult = Items.GroupBy(x => x.StartTime,
(key, grpItems) => new { key, Items = grpItems.OrderBy(y => y.Name) });
GroupByの2番目の部分では、キーとそのキーの下のアイテムのグループを取り、元のクエリで行っているのと同じ、指定したエントリを返すラムダ式を指定できます。
お役に立てれば!