これです:
var persons = new[] {
new Foo { PersonId = "P1", CaseId = "C19" },
new Foo { PersonId = "P2", CaseId = "C23" },
new Foo { PersonId = "P2", CaseId = "C24" },
new Foo { PersonId = "P1", CaseId = "C28" },
new Foo { PersonId = "P3", CaseId = "C07" },
new Foo { PersonId = "P2", CaseId = "C32" },
new Foo { PersonId = "P3", CaseId = "C60" },
new Foo { PersonId = "P1", CaseId = "C20" },
};
var res = (from p in persons
group p by p.PersonId into q
orderby q.Min(r => r.CaseId)
select q).ToArray();
要求通りにします。
あなたgroup by
PersonId
と各グループのorderby
。Min(r => r.CaseId)
しかし、おそらく関数表記法ではより明確です。
var res2 = persons.GroupBy(p => p.PersonId)
.OrderBy(p => p.Min(q => q.CaseId))
.ToArray();
書かれているように、グループは順序付けられており、グループの「内部」の要素ではありません。
グループ内の要素もソートしたい場合:
var res3 = (from p in persons
orderby p.CaseId
group p by p.PersonId into q
orderby q.Min(r => r.CaseId)
select q).ToArray();
グループ化により要素の順序が保持されるためです (少なくとも LINQ to Objects では。EF または LINQ-to-SQL で同じであることは保証できません)。