0

我在我的网站上创建了一个新闻部分。没有什么新东西而且工作正常。除了现在我想按日期对新闻进行排序。一个问题是排序日期分布在多个列上。我创建了一个非强制性的新闻日期字段。当 newsdate 列为空时,使用创建日期。

如何使用这两个列对我的 newsItems 进行排序

例子

newsitem1:新闻日期 = 2012 年 8 月 3 日,创建日期 = 2012 年 8 月 7 日

newsitem2:newsdate = emtpy,创建日期 = 2012 年 8 月 7 日

newsitem3:newsdate = 2012 年 7 月 25 日,createDate 8 月 7 日

结果(排序顺序):

新站点m2、新站点m1、新站点m3

因为一切都是在 Umbraco 中使用 razorview-marco 创建的,所以我看不到操作对象的选项,因此必须在 linq-query 中进行排序。

var nodes = @Model.AncestorOrSelf("Home").Children.Where("Visible").OrderBy(???)
4

3 回答 3

0

在 Razor 中对任何稍微复杂的东西进行排序时,我已将结果转换为 List,然后使用 delagate。这是一个不理想的特殊情况,但可以让您了解语法。

possibleListings.Sort(delegate(DynamicNode x, DynamicNode y)
{
  dynamic xNode = @Model.NodeById(x.Id);
  dynamic yNode = @Model.NodeById(y.Id);

  dynamic xListingLevel = @Model.NodeById(xNode.ListingType);
  dynamic yListingLevel = @Model.NodeById(yNode.ListingType);

  int xSort = xListingLevel.SortOrder;
  int ySort = yListingLevel.SortOrder;
  return xSort.CompareTo(ySort);
});

希望这能让你走上正轨。

于 2012-08-07T16:26:34.563 回答
0

您可以按以下顺序使用条件表达式:.OrderByDescending(t => t.NewsDate.HasValue ? t.NewsDate : t.CreationDate).ToList();

    public class News
    {
        public DateTime? NewsDate;
        public DateTime? CreationDate;
        public string Name;
        public News(string name, DateTime? newsDate, DateTime? creationDate) { this.Name = name; this.NewsDate = newsDate; this.CreationDate = creationDate; }
    }

    [TestMethod()]
    public void NewsTestOrderBy()
    {
        var news1 = new News("newsitem1", new DateTime(2012, 8, 3), new DateTime(2012, 8, 7));
        var news2 = new News("newsitem2", null, new DateTime(2012, 8, 7));
        var news3 = new News("newsitem3", new DateTime(2012, 7, 25), new DateTime(2012, 8, 7));

        var news = new List<News>() { news1, news2, news3 };
        var orderedNews = news.OrderByDescending(t => t.NewsDate.HasValue ? t.NewsDate : t.CreationDate).ToList();

        Assert.AreEqual(news2, orderedNews[0]);
        Assert.AreEqual(news1, orderedNews[1]);
        Assert.AreEqual(news3, orderedNews[2]);
    }
于 2012-08-07T10:09:19.907 回答
0

如果您的日期字段是可为空的DateTime值,那么这将起作用:

.OrderBy(x => x.newsdate ?? x.createDate)

如果它们是以这样的方式格式化的字符串,它们将正确排序,那么这将起到作用:

.OrderBy(x => !string.IsNullOrWhiteSpace(x.newsdate) ? x.newsdate : x.createDate)

如果它们是具有您在示例中共享的值的字符串,那么您需要将它们转换为DateTime实例以按如下方式排序:

.OrderBy(x => !string.IsNullOrWhiteSpace(x.newsdate) ? DateTime.Parse(x.newsdate) : DateTime.Parse(x.createDate))
于 2015-06-18T22:44:27.500 回答