C# .OrderBy具有.GroupBy的多列

C# .OrderBy具有.GroupBy的多列,c#,.net,linq,C#,.net,Linq,我正在开发一个应用程序,它有一个设施下拉列表,该设施应按州分组,按州分组中设施名称的字母顺序排列,然后州组也需要按字母顺序排列。初始数据列表如下所示: _pageFacilityData.Add(new FacilityDTO { ClientID = (long) fds.ClientId, FacilityID = fds.FacilityId, Name = fds.Name, State = fds.State }); var groupedByStat

我正在开发一个应用程序,它有一个设施下拉列表,该设施应按州分组,按州分组中设施名称的字母顺序排列,然后州组也需要按字母顺序排列。初始数据列表如下所示:

_pageFacilityData.Add(new FacilityDTO {
    ClientID = (long) fds.ClientId,
    FacilityID = fds.FacilityId,
    Name = fds.Name,
    State = fds.State
});
var groupedByState = _pageFacilityData.GroupBy(x => x.State).OrderBy(y => y.Key).ToList();
@foreach (var state in ViewBag.FacilityDTOs) {
    <optgroup id=@state label=@state>
        @foreach (var facility in state) {
            <option id="c @facility.FacilityID" value="@facility.FacilityID">@facility.Name</option>
        }
    </optgroup>
}
当前的LINQ语句(不按字母顺序排列状态分组)如下所示:

_pageFacilityData.Add(new FacilityDTO {
    ClientID = (long) fds.ClientId,
    FacilityID = fds.FacilityId,
    Name = fds.Name,
    State = fds.State
});
var groupedByState = _pageFacilityData.GroupBy(x => x.State).OrderBy(y => y.Key).ToList();
@foreach (var state in ViewBag.FacilityDTOs) {
    <optgroup id=@state label=@state>
        @foreach (var facility in state) {
            <option id="c @facility.FacilityID" value="@facility.FacilityID">@facility.Name</option>
        }
    </optgroup>
}
我一直在寻找解决方案,但未能找到符合我需要的答案。另外,为了澄清,此代码是由其他人编写的。我仍然无法100%确定y.Key值来自何处,或者它是如何设置的

为了进一步澄清,数据正在.cshtml视图中使用,如下所示:

_pageFacilityData.Add(new FacilityDTO {
    ClientID = (long) fds.ClientId,
    FacilityID = fds.FacilityId,
    Name = fds.Name,
    State = fds.State
});
var groupedByState = _pageFacilityData.GroupBy(x => x.State).OrderBy(y => y.Key).ToList();
@foreach (var state in ViewBag.FacilityDTOs) {
    <optgroup id=@state label=@state>
        @foreach (var facility in state) {
            <option id="c @facility.FacilityID" value="@facility.FacilityID">@facility.Name</option>
        }
    </optgroup>
}
@foreach(ViewBag.FacilityDTOs中的变量状态){
@foreach(状态中的var设施){
@设施名称
}
}

分组时,您可以在列表中排序:

var groupedByState = _pageFacilityData
    .GroupBy(
        x => x.State,
        x=>x,
        (k,v)=>new KeyValuePair<string,List<FacilityDTO>>(k, v.OrderBy(y=>y.Name).ToList()))
    .OrderBy(y => y.Key)
    .ToList();
var groupedByState=\u页面设施数据
.群比(
x=>x.状态,
x=>x,
(k,v)=>newkeyvaluepair(k,v.OrderBy(y=>y.Name).ToList())
.OrderBy(y=>y.Key)
.ToList();
编辑:在cshtml中尝试以下操作:

@foreach (KeyValuePair<string,List<FacilityDTO>> state in ViewBag.FacilityDTOs) {
    <optgroup id=@state.Key label=@state.Key>
        @foreach (var facility in state.Value) {
            <option id="c @facility.FacilityID" value="@facility.FacilityID">@facility.Name</option>
        }
    </optgroup>
}
@foreach(ViewBag.FacilityTos中的KeyValuePair状态){
@foreach(状态为var设施的价值){
@设施名称
}
}

这将为您提供您想要的:

var groupedByState = _pageFacilityData.OrderBy(x => x.State).GroupBy(x => x.State).Select(g => g.OrderBy(grp => grp.Name));
这是一个基于我从你的PageFacilityTo课程中收集到的内容的演示:

下面是返回结果的屏幕截图:


y.Key的
类型是什么?
.Key
属性实际上不是我的模型或代码使用的属性。据我所知,它是由查询创建的iGroup的一部分。
我仍然不能100%确定y.Key值来自何处,或者它是如何设置的。
请查看文档以了解
GroupBy
返回的内容。因此,我不明白为什么这不起作用,除非在加载使用数据的视图时发生此错误:
RuntimeBinderException:'object'不包含'Key'的定义。
@travisdmcdaniel如果尝试此操作,会发生什么:
var groupedByState=\u pageFacilityData.OrderBy(x=>x.State).GroupBy(x=>x.State).Select(g=>g.Select(x=>newfacilitydto{State=g.Key,ClientID=x.ClientID,FacilityID=x.FacilityID,Name=x.Name})).ToList();
当使用数据的视图像加载其他解决方案一样加载时,此解决方案会出现相同的错误:
RuntimeBinderException:“object”不包含“Key”的定义。
@TravisdManiel好吧,您在问题中添加了新信息。谁是
ViewBag.FacilityTos
,这不在您的代码中?对不起,我没有点击.cshtml页面上的代码开始导致问题。
ViewBag.FacilityTos
正被设置为控制器中的
groupedByState
变量。@TravisdManiel尝试我的编辑,看看是否有效。同样的错误。似乎导致错误的特定行(键导致问题的地方)是