C#订购事件日期的空值为

时间:2016-04-25 11:47:09

标签: c# .net sitecore sql-order-by

我正在使用C#开设课程列表,课程最多可以有5个日期。理想情况下,将选择今天之后的下一个日期,并在列表中进行相应的排序。

到目前为止我所拥有的是一个获取下一个日期的课程列表,并显示它,但它显示所有没有日期的事件(空/空)。我试图首先显示下一个日期的课程,然后是那些没有这个课程的课程。

C#代码:

public ActionResult FilterList(string role = null, string category = null)
    {
        return View("~/Views/FilterList.cshtml", GetCourses(role, category));
    }

    [NonAction]
    public List<IEnumerable<Course>> GetCourses(string role = null, string category = null)
    {
        var collection = new List<IEnumerable<Course>>();
        var items = Sitecore.Context.Database.GetItem(SitecoreIDs.Pages.CourseRoot)
            .Children.Where(m => m.TemplateID == Course.TemplateID)
            .Select(m => (Course)m).ToList();

        var dates = new List<FilterDates>();
        items.ForEach(m => dates.Add(new FilterDates
        {
            Dates = new List<DateTime>{ m.Date1, m.Date2, m.Date3, m.Date4, m.Date5 },
            Name = m.Name
        }));

        dates.ForEach(m => m.Dates.RemoveAll(n => n == new DateTime(0001, 01, 01)));
        dates.ForEach(m => m.Dates.Sort((a, b) => a.CompareTo(b)));
        dates = dates.OrderBy(m => m.Dates.AsQueryable().FirstOrDefault(n => n - DateTime.Now >= TimeSpan.Zero)).ToList();
        var model = new List<Course>();
        dates.ForEach(m => model.Add(items.AsQueryable().FirstOrDefault(n => n.Name == m.Name)));

        if (!string.IsNullOrEmpty(role) || !string.IsNullOrEmpty(category))
        {
            var currentRole = Sitecore.Context.Database.GetItem(SitecoreIDs.Pages.CategoryRoot)
                .Children.AsQueryable().FirstOrDefault(m => m.Fields["Key"].Value == role);

            if (!string.IsNullOrEmpty(category))
            {
                var currentCategory = Sitecore.Context.Database.GetItem(SitecoreIDs.Pages.SeriesRoot)
                .Children.AsQueryable().FirstOrDefault(m => m.Fields["Key"].Value == category);

                model = model.Where(m => m.Series == currentCategory.Name).ToList();

                if (string.IsNullOrEmpty(role))
                {
                    collection.Add(model);
                }
            }

            if (!string.IsNullOrEmpty(role))
            {
                model = model.Where(m => m.InnerItem.Children.Where(n => n.Fields["Key"].Value == currentRole.Name).Any()).ToList();
                List<Course> required = new List<Course>(), recommended = new List<Course>(), refresh = new List<Course>();

                foreach (var item in model)
                {
                    foreach (Item inner in item.InnerItem.Children)
                    {
                        if (inner.Fields["Key"].Value == currentRole.Name)
                        {
                            switch (inner.Fields["Severity"].Value)
                            {
                                case "Required":
                                    required.Add(item);
                                    break;
                                case "Recommended":
                                    recommended.Add(item);
                                    break;
                                case "Refresh":
                                    refresh.Add(item);
                                    break;
                            }
                        }
                    }
                }

                collection.Add(required);
                collection.Add(recommended);
                collection.Add(refresh);
            }
        }
        else
        {
            collection.Add(model);
        }
        return collection;
    }

我尝试了不同的订单,但似乎无法获得正确的订购。任何帮助将不胜感激。

安迪

1 个答案:

答案 0 :(得分:1)

您发布的代码有一些与您的排序问题无关的额外内容。我忽略了这一点,只是解决了手头的问题:如何对你的课程进行排序,以便将最近的日期排在第一位。

我会创建一个小方法来返回下一个将来的日期或DateTime.MaxValue作为&#34; null&#34;值。

private DateTime GetNextFutureDate(Course course)
{
    var dates =
        new[] {course.Date1, course.Date2, course.Date3, course.Date4, course.Date5}.Where(d => d > DateTime.Now).ToArray();
    return dates.Length == 0 ? DateTime.MaxValue : dates[0];
}

然后在您的GetCourses方法中,您可以像这样使用它:

[NonAction]
public List<IEnumerable<Course>> GetCourses(string role = null, string category = null)
{
    var collection = new List<IEnumerable<Course>>();
    var model = Sitecore.Context.Database.GetItem(SitecoreIDs.Pages.CourseRoot)
        .Children.Where(m => m.TemplateID == Course.TemplateID)
        .Select(m => (Course)m).OrderBy(m => GetNextFutureDate(m));

    if (!string.IsNullOrEmpty(role) || !string.IsNullOrEmpty(category))
    // ... the rest of your code ...

    return collection;
}

您可能还想考虑在课程类中使GetNextFutureDate成为成员或扩展方法。