如何根据模型中 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>
找到接受 string
的 OrderBy
方法。这就是为什么现在我写了 x => x.ProgramId
表达式。
我个人会对您的代码进行许多改进,但我觉得它有点混乱。一旦我们找到了您问题的正确解决方案,如果您愿意,我们可以寻找不同的方法来解决这个问题。
这比其他问题要复杂一些。我有一个封装 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>
找到接受 string
的 OrderBy
方法。这就是为什么现在我写了 x => x.ProgramId
表达式。
我个人会对您的代码进行许多改进,但我觉得它有点混乱。一旦我们找到了您问题的正确解决方案,如果您愿意,我们可以寻找不同的方法来解决这个问题。