如何修复以下代码以便订购?

时间:2013-12-11 00:47:14

标签: c# .net linq asp.net-mvc-4

我正在使用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; }


    }

然后我遇到了其他问题...

任何帮助将不胜感激

由于

2 个答案:

答案 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

这使得月份按我定义的顺序保存

感谢您的帮助