我在我的网站上创建了一个新闻栏目。什么都没有新的和工作正常。除了现在我想按日期排序新闻项目。一个问题是排序日期分布在多个列上。我创建了一个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(???)
答案 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))