为多个DateTime列排序表达式

时间:2012-08-07 08:25:52

标签: c# linq razor umbraco

我在我的网站上创建了一个新闻栏目。什么都没有新的和工作正常。除了现在我想按日期排序新闻项目。一个问题是排序日期分布在多个列上。我创建了一个newsdate字段,这不是强制性的。当newsdate列为空时,将使用创建的日期。

如何使用这两列

对newsItems进行排序

实施例

newsitem1:newsdate = 2012年8月3日,createDate = 2012年8月7日

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

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

结果(排序顺序):

newsitem2,newsitem1,newsitem3

因为所有都是使用razorview-marco在Umbraco中创建的,所以我看不到操作对象的选项,因此必须在linq查询中完成排序。

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

3 个答案:

答案 0 :(得分: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]);
    }

答案 1 :(得分: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);
});

希望能让你走上正轨。

答案 2 :(得分: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))