我正在使用MVC 4创建一个应用程序。该代码要求它为每个月的个人提供数据。我编写了代码,以便它可以做到这一点。 但这个月没有订购。最终结果显示这几个月到处都是。 我希望这些月份按照正确的顺序在1月,2月......
我的模型如下,
public class NonComplianceData
{
public static IEnumerable<string> Months = new string[] { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
public int InspectorId { get; set; }
public string InspectorName { get; set; }
public IEnumerable<MonthData> FullYearData { get; set; }
}
public class MonthData
{
public string Month { get; set; }
public int TotalAuditsCompleted { get; set; }
public int TotalNoDefects { get; set; }
public decimal NonComplianceRate
{
get
{
if (TotalAuditsCompleted == 0)
{
return 0;
}
else
{
return (TotalNoDefects / (decimal)TotalAuditsCompleted) * 100;
}
}
}
}
然后填充数据的代码是
var inspectorData = context.COESDetails
.Where(x => x.UploadCOESDetails.AuditZoneId == criteria.AuditZoneId
&& x.UploadCOESDetails.AuditMonth.Contains(criteria.AuditYear))
.Select(x => x.Inspector)
.Where(y => y.Id != 0)
.Distinct()
.OrderBy(x => x.Firstname)
.Select(ud =>
new NonComplianceData
{
InspectorId = ud.Id,
InspectorName = ud.Firstname + " " + ud.Surname,
FullYearData = NonComplianceData.Months.Select(month => new MonthData
{
Month = month,
TotalAuditsCompleted = context.COESDetails.Count(x => x.UploadCOESDetails.AuditZoneId == criteria.AuditZoneId && x.UploadCOESDetails.AuditMonth == (month + " " + criteria.AuditYear) && x.InspectorId == ud.Id && x.AuditType != (int)AuditType.NotSelected),
TotalNoDefects = context.COESDetails.Count(x => x.UploadCOESDetails.AuditZoneId == criteria.AuditZoneId && x.UploadCOESDetails.AuditMonth == (month + " " + criteria.AuditYear) && x.InspectorId == ud.Id && x.AuditType != (int)AuditType.NotSelected && x.COESDetailsCOESDefects.Any())
})
});
所以我怎样才能按月订购?
我最初认为可能有类似以下的模型
public class MonthDefinitions
{
public string Month { get; set; }
public int Order { get; set; }
}
然后我遇到了其他问题...
任何帮助将不胜感激
由于
答案 0 :(得分:1)
您的问题是您使用的是名称,而不是它们的值。
所以你会得到的是:
&GT; 四月 八月 十二月 二月 一月 七月 六月 游行 可以 十一月 十月 九月
您可以使用数组位置,也可以按照建议,将数值附加到每个月,然后按此排序。
看看this answer,但基本上使用类似的东西:
DateTime.ParseExact(monthName, "MMMM", CultureInfo.CurrentCulture ).Month
假设:
IEnumerable<string> Months = new string[]
{ "January", "February", "March", "April", "May",
"June", "July", "August", "September", "October",
"November", "December" };
你想:
var sorted_months =
Months.OrderBy(m => DateTime.ParseExact(m, "MMMM", System.Globalization.CultureInfo.CurrentCulture ))
这将为您提供正确顺序的月份
答案 1 :(得分:1)
我工作的其中一个人向我解释了这个...... 他说把它当作
IEnumerable<string> Months = new string[]
{ "January", "February", "March", "April", "May",
"June", "July", "August", "September", "October",
"November", "December" };
定义数组时,如图所示使用它。默认情况下,不应用任何排序,它将按照定义使用。
但是在我的代码中,当我预先填充数据时,因为我正在使用实体框架工作,当它被传递给sql时它正在进行排序。所以他建议我在我的SQL调用结束时放一个toList
var inspectorData = context.COESDetails
.Where(x => x.UploadCOESDetails.AuditZoneId == criteria.AuditZoneId
&& x.UploadCOESDetails.AuditMonth.Contains(criteria.AuditYear)).ToList()....rest of the code
这使得月份按我定义的顺序保存
感谢您的帮助