C# 我想根据字符串和int对Linq中组内的对象进行排序

C# 我想根据字符串和int对Linq中组内的对象进行排序,c#,linq,entity-framework,C#,Linq,Entity Framework,我有一个同时具有ID和类别的练习对象。为了回答这个问题,让我们假设它看起来像这样: public class Exercise { public int ID; public string category; } ID是唯一的,类别不是唯一的 我想使用Linq按类别对练习进行分组,然后根据它们的ID对每个类别内的练习进行排序。类别的顺序也应基于ID,第一个练习的类别应始终是对练习进行分组后的第一个类别。(换句话说,组的顺序应由每个组中第一个对象的ID确定,这些ID的顺序应与组的

我有一个同时具有ID和类别的练习对象。为了回答这个问题,让我们假设它看起来像这样:

public class Exercise
{
    public int ID;
    public string category;
}
ID是唯一的,类别不是唯一的

我想使用Linq按类别对练习进行分组,然后根据它们的ID对每个类别内的练习进行排序。类别的顺序也应基于ID,第一个练习的类别应始终是对练习进行分组后的第一个类别。(换句话说,组的顺序应由每个组中第一个对象的ID确定,这些ID的顺序应与组的顺序匹配。)

例如:

{ ID: 1, category: "C#" }
{ ID: 2, category: "ASP" }
{ ID: 3, category: "C#" }
ID为1和3的对象应位于ID为2的对象之前,即使ASP按字母顺序位于C#之前

这是我的LINQ代码:

_db.Exercise.GroupBy(item => item.category)
            .OrderBy(group => group.FirstOrDefault().ID)
            .SelectMany(group => group)
            .ToList();
它像我期望的那样将练习分组,但不管我做什么,分组的顺序都是按字母顺序排列的。我希望组上的OrderBy能够对组进行排序,但遗憾的是

我试着把订购单放在不同的地方,但没有成功。另外,仅仅使用OrderBy似乎也不起作用。同时使用ID和类别作为键的GroupBy似乎也不起作用


有人能帮我吗?这是我第一次在LINQ尝试这种“高级”的东西。提前感谢。

groupId
-相同类别的所有练习的最低ID

一旦你有了它,这是一个简单的订单

var query = from e in _db.Exercise
            let groupId = _db.Exercise.Where(x => x.category == e.category).Select(x => x.ID).Min()
            order by groupId, e.ID
            select e;

这应该可以做到:

List<Exercise> selectMany = _db.Exercise.GroupBy(exercise => exercise.category)
                                        .SelectMany(grouping => 
                                                    grouping.OrderBy(e => e.ID))
                               .ToList();
List selectMany=\u db.Exercise.GroupBy(Exercise=>Exercise.category)
.SelectMany(分组=>
grouping.OrderBy(e=>e.ID))
.ToList();

IEnumerable
上调用
OrderBy
时,您正在对组进行排序。听起来您想要做的是让所有组保持相同的顺序,并将每个组投影到一个新的组中,在该组中对项目进行排序。使用
Select
将每个组投影到一个新组,然后使用
OrderBy
对组本身进行排序:

var query = _db.Exercise.GroupBy(item => item.category)
    .Select(group => group.OrderBy(item => item.ID));
另一方面,如果您只想先按类别排序,然后按ID排序,只需使用
OrderBy
然后按

var query = _db.Exercise.OrderBy(item => item.category)
    .ThenBy(item => item.ID);

您只需按
ID
排序,然后按
Category
分组,就可以得到您想要的:

_db.Exercise.OrderBy(item => item.ID)
            .GroupBy(item => item.category)
            .SelectMany(group => group)
            .ToList();
结果:

List<> (3 items)
ID   category 
---- ---------
1    C# 
3    C# 
2    ASP 

删除
.FirstOrDefault()
是否有帮助?您可以使用
OrderBy
然后再使用
ThenBy
在一个不依赖于实现细节的不太做作的庄园中执行此操作。@Servy结果会有所不同-根据示例数据,如果您按类别排序,则按ID排序,项目2(ASP)将排在第一位。如果按ID排序,然后按类别排序,则C#项将被分解。@Servy-至少它是一个文档化的实现细节。:)我接受这个答案是因为它与我的测试数据有关,但与我的真实数据(不同的类)无关。这是一个新的问题,至少我现在知道LINQ查询应该可以正常工作。谢谢我想如果Aducci想尽可能地平展收藏,你需要
选择许多
?@Aducci。很明显,如果他愿意的话,他已经知道如何使用这个手术了。如果他不想把藏品压扁,我通常会发现第一个解决方案很有用。如果他这样做了,那么不使用这种解决方案可能更为正确。
_db.Exercise.OrderBy(item => item.ID)
            .GroupBy(item => item.category)
            .OrderBy(g => g.First().ID)
            .SelectMany(group => group)
            .ToList();