如何根据模型中 IList<T> 中的 属性 对模型进行排序

How to Sort a Model Based on a Property in IList<T> within that Model

这比其他问题要复杂一些。我有一个封装 IList 的模型。在每个 IList 项中有多个列表。这使得扁平化整个数据集变得非常困难。我需要同时过滤 and/or 根据 IList 中的值对最高的 IList 项目进行排序。例如,假设我的结构如下:

public class ScorecardModel
{
  //Measure Data
  public IList<ProgramScorecardModel> ProgramScorecardModel { get; set; }
                
}

public class ProgramScorecardModel
{
    public string programId { get; set; }
    public DateTime? reportingDate { get; set; }
    public string programName { get; set; }

    //Measure Data
    public IList<Sales_ViewModel> Sales_ViewModel { get; set; }
    public IList<Employees_ViewModel> Employees_ViewModel { get; set; }
    public IList<Locations_ViewModel> Locations_ViewModel { get; set; }

}

我的记分卡returns 所有程序及其各自的数据。我想要做的是 sort/filter 基于 programId 的 ProgramScorecard 模型。

下面是我如何调用填充记分卡的查询。

ScorecardModel scorecard = new ScorecardModel();
scorecard = _adoSqlService.GetScorecard();

我想调用以下排序函数:

private ScorecardModel sortScorecard(ScorecardModel scorecardList, string sortField, string sortDirection)
{
    IQueryable<ScorecardModel> sortedScorecard = scorecardList.AsQueryable();
    sortedScorecard = sortedScorecard.OrderBy(sortField + " " + sortDirection);
    return sortedScorecard;
}

问题是记分卡列表不可枚举。如果我更改函数以使用它,那么记分卡加载 (GetScorecard) 会抛出错误。

IEnumerable<ScorecardModel> scorecard = null;
scorecard = _adoSqlService.GetScorecard();

private IEnumerable<ScorecardModel> sortScorecard(IEnumerable<ScorecardModel> scorecardList, string sortField, string sortDirection)
{
  IQueryable<ScorecardModel> sortedScorecard = scorecardList.AsQueryable();
  sortedScorecard = sortedScorecard.OrderBy(sortField + " " + sortDirection);
  return sortedScorecard;
} 

我试过更改 GetScorecard 例程,但无法使以下程序正常工作:

public IList<ScorecardModel> GetScorecard()
{
   string programid;
   string reportingdate = "2/1/2022";
   IList<ProgramViewModel> proglist = new List<ProgramViewModel>();
   proglist = GetPrograms();
   IList <ScorecardModel> scorecardData = new List<ScorecardModel>();
   scorecardData.ProgramScorecardModel = new List<ProgramScorecardModel>(); <---This Line Here, ProgramScorecardModel is not able to be a list
   int i = 0;
   foreach (var p in proglist)
   {
       ProgramScorecardModel programData = new ProgramScorecardModel();
       programData.programId = p.programId;
       programData.programName = p.programName;
       programid = p.programId;
       programData.Sales_ViewModel = new List<Sales_ViewModel>(GetSalesData(programid, reportingdate));
       programData.Employees_ViewModel = new List<Employees_ViewModel>(GetEmployeesData(programid, reportingdate));
       programData.Locations_ViewModel = new List<Locations_ViewModel>(GetLocationsData(programid, reportingdate));
       scorecardData.ProgramScorecardModel.Add(programData);
       i++;
    }
    return scorecardData;
}

如何使整个 scorecardData 和 scorecardData.ProgramScorecardModel 成为一个令人难忘的对象?

假设我将其作为可枚举对象使用,我是否能够对 scorecardData.ProgramScorecardModel[x].programName 值进行排序和过滤?

附加信息 这就是我目前填充记分卡模型的方式

public ScorecardModel GetScorecard()
{
    string programid;
    string reportingdate = "2/1/2022";
    IList<ProgramViewModel> proglist = new List<ProgramViewModel>();
    proglist = GetPrograms();
    ScorecardModel scorecardData = new ScorecardModel();
    scorecardData.ProgramScorecardModel = new List<ProgramScorecardModel>();
    int i = 0;
    foreach (var p in proglist)
    {
        ProgramScorecardModel programData = new ProgramScorecardModel();
        programData.programId = p.programId;
        programData.programName = p.programName;
        programid = p.programId;
        programData.Locations_ViewModel = new List<Locations_ViewModel>(GetLocationData(programid, reportingdate));
        programData.Employees_ViewModel = new List<Employees_ViewModel>(GetEmployeeData(programid, reportingdate));
        programData.Sales_ViewModel = new List<Sales_ViewModel>(GetSalesData(programid, reportingdate));

        scorecardData.ProgramScorecardModel.Add(programData);   
        i++; //This is used in some other code I have removed for simplification
    }
    return scorecardData;
}

最终结果是这样的:
记分卡模型
ProgramScorecardModel[i]
程序编号
Locations_ViewModel
Employees_ViewModel
Locations_ViewModel
ProgramScorecardModel[i]
程序编号
Locations_ViewModel
Employees_ViewModel
Locations_ViewModel
ProgramScorecardModel[i]
程序编号
Locations_ViewModel
Employees_ViewModel
Locations_ViewModel

以下是我如何使用记分卡模型的过度简化:

for (int i = 0; i < @Model.ProgramScorecardModel.Count; i++)
{
    <tr>
        <td rowspan="2" style="text-align: left; border: 1px solid black; padding-left: 5px">@Model.ProgramScorecardModel[i].programName</td>


        @{string results = Model.ProgramScorecardModel[i].Sales_ViewModel[0].rating;

            <td colspan="3" class="tdtooltip @(results == "R" ? "measure_red" : results == "Y" ? "measure_yellow" : results == "G" ? "measure_green" : results == "NR" ? "measure_nr" : results == "NS" ? "measure_ns" : "measure_na")">
                @Model.ProgramScorecardModel[i].Sales_ViewModel[0].rating
                @if (@Model.ProgramScorecardModel[i].Sales_ViewModel[0].comments.Length > 0)
                {
                    <span class="tooltiptext">@Html.Raw(Model.ProgramScorecardModel[i].Sales_ViewModel[0].comments)</span>
                }
            </td>
        }

        @{results = Model.ProgramScorecardModel[i].Employees_ViewModel[0].rating;

            <td colspan="3" class="tdtooltip @(results == "R" ? "measure_red" : results == "Y" ? "measure_yellow" : results == "G" ? "measure_green" : results == "NR" ? "measure_nr" : results == "NS" ? "measure_ns" : "measure_na")">
                @Model.ProgramScorecardModel[i].Employees_ViewModel[0].rating
                @if (@Model.ProgramScorecardModel[i].Employees_ViewModel[0].comments.Length > 0)
                {
                    <span class="tooltiptext">@Html.Raw(Model.ProgramScorecardModel[i].Employees_ViewModel[0].comments)</span>
                }
            </td>
        }

        @{ results = Model.ProgramScorecardModel[i].Locations_ViewModel[0].rating;

            <td colspan="3" class="tdtooltip @(results == "R" ? "measure_red" : results == "Y" ? "measure_yellow" : results == "G" ? "measure_green" : results == "NR" ? "measure_nr" : results == "NS" ? "measure_ns" : "measure_na")">
                @Model.ProgramScorecardModel[i].Locations_ViewModel[0].rating
                @if (@Model.ProgramScorecardModel[i].Locations_ViewModel[0].comments.Length > 0)
                {
                    <span class="tooltiptext">@Html.Raw(Model.ProgramScorecardModel[i].Locations_ViewModel[0].comments)</span>
                }
            </td>
        }
       
    </tr>
}

在写答案时有几件事我不明白。也许我们可以一起想办法。现在,我将 post 让事情正常进行的起点是什么。

using System.Linq;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {
        var scorecard = GetScorecard();
        var sortedScorecard = scorecard.WithSortedPrograms("programId", "ascending");
    }
    
    public static ScorecardModel GetScorecard()
    {
        var proglist = new List<ProgramViewModel>();
        // proglist = GetPrograms();
        
        var scorecardData = new List<ProgramScorecardModel>();
        foreach (var p in proglist)
        {
          var programData = new ProgramScorecardModel();
          programData.ProgramId = p.ProgramId;
          scorecardData.Add(programData);
        }
        
        var scorecard = new ScorecardModel();
        scorecard.ProgramScorecardModel = scorecardData;
        return scorecard;
    }
}

public class ScorecardModel
{
  public List<ProgramScorecardModel> ProgramScorecardModel { get; set; }
    
  public ScorecardModel WithSortedPrograms(string sortField, string sortDirection)
  {
      var sortedModel = new ScorecardModel();
      // sortedModel.ProgramScorecardModel = ProgramScorecardModel.AsQueryable().OrderBy(sortField + " " + sortDirection);
      sortedModel.ProgramScorecardModel = ProgramScorecardModel.OrderBy(x => x.ProgramId).ToList();
      return sortedModel;
  }
}

public class ProgramScorecardModel
{
    public string ProgramId { get; set; }
}

public class ProgramViewModel
{
    public string ProgramId { get; set; }
}

我无法为 IQueryable<T> 找到接受 stringOrderBy 方法。这就是为什么现在我写了 x => x.ProgramId 表达式。

我个人会对您的代码进行许多改进,但我觉得它有点混乱。一旦我们找到了您问题的正确解决方案,如果您愿意,我们可以寻找不同的方法来解决这个问题。