C# 多个DateTime列的排序表达式

C# 多个DateTime列的排序表达式,c#,linq,razor,umbraco,C#,Linq,Razor,Umbraco,我已经在我的网站上创建了一个新闻部分。没有什么新的,工作正常。除了现在我想按日期对新闻进行排序。一个问题是排序日期分布在多个列上。我创建了一个非强制的newsdate字段。当newsdate列为空时,将使用创建的日期 如何使用这两个列对新闻项进行排序 范例 newsitem1:newsdate=2012年8月3日,createDate=2012年8月7日 newsitem2:newsdate=emtpy,创建日期=2012年8月7日 newsitem3:newsdate=2012年7月25日,c

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

如何使用这两个列对新闻项进行排序

范例

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

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

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

结果(排序顺序):

新闻项目2、新闻项目1、新闻项目3

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

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

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

公共类新闻
{
公共日期时间?新闻日期;
公共日期时间?CreationDate;
公共字符串名称;
公共新闻(字符串名称,DateTime?newsDate,DateTime?creationDate){this.name=name;this.newsDate=newsDate;this.creationDate=creationDate;}
}
[TestMethod()]
public void NewsTestOrderBy()
{
var news1=新新闻(“newsitem1”、新日期时间(2012年8月3日)、新日期时间(2012年8月7日));
var news2=新新闻(“newsitem2”,空,新日期时间(2012,8,7));
var news3=新新闻(“newsitem3”、新日期时间(2012,7,25)、新日期时间(2012,8,7));
var news=newlist(){news1,news2,news3};
var orderedNews=news.OrderByDescending(t=>t.NewsDate.HasValue?t.NewsDate:t.CreationDate.ToList();
AreEqual(news2,orderedNews[0]);
AreEqual(news1,orderedNews[1]);
AreEqual(新闻3,orderedNews[2]);
}

在Razor中对稍微复杂的内容进行排序时,我将结果转换为一个列表,然后使用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);
});

希望这能让您走上正轨。

如果您的日期字段可为空
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))

是否可以在Lambda或类似的对象中创建新的动态对象?比如:@var nodes=@Model.AncestorOrSelf(“Home”).Children.Where(“可见”).OrderBy(新日期时间(“新闻日期”)=''?DateTime.Parse(“新闻日期”):DateTime.Parse(“createDate”)“desc”);谢谢你的建议。只是我觉得Umbraco(我是Umbraco的新手)不接受此操作。我收到一条错误消息:如果不首先将lambda表达式强制转换为委托或表达式树类型,则无法将其用作动态调度操作的参数
.OrderBy(x => !string.IsNullOrWhiteSpace(x.newsdate) ? DateTime.Parse(x.newsdate) : DateTime.Parse(x.createDate))