我有以下代码:
var resultArticles = from a in articleItems
select new
{
Title = a.Title,
ArticleDate = a[Constants.FieldNames.ArticleStartDate] != null ?
((DateTime)a[Constants.FieldNames.ArticleStartDate]).ToString(Constants.Date.Format): string.Empty,
ByLine = a[Constants.FieldNames.Byline],
FileRef = SPUtility.ConcatUrls(web.Url, a.Url)
};
var sortedArticles = resultArticles.OrderBy(a => a.ArticleDate).ToList();
rptArticles.DataSource = sortedArticles;
rptArticles.DataBind();
我想在这里必须有更好的方法来排序/订购,因为如果我有日期(年/月/日)
12.01.2011
11.02.2011
10.02.2011
13.01.2011
08.02.2011
它只按天排序,不考虑月份,因此sortedArticles的结果如下:
08.01.2011
10.02.2011
11.02.2011
12.01.2011
13.01.2011
我显然想先显示最新文章,即11.02.2011
有什么建议吗?
提前致谢。
答案 0 :(得分:0)
问题是,在您的选择中,您在日期字段上调用了ToString
。因此,ArticleDate将被投射为字符串。这就是它没有正确排序的原因。
将ArticleDate投射为可以为空的日期可能是您最好的选择
var resultArticles = from a in articleItems
select new
{
Title = a.Title,
ArticleDate = a[Constants.FieldNames.ArticleStartDate] != null ?
((DateTime)a[Constants.FieldNames.ArticleStartDate]) : default(DateTime?),
ByLine = a[Constants.FieldNames.Byline],
FileRef = SPUtility.ConcatUrls(web.Url, a.Url)
};
此外,对于这样简单的事情,您可以使用更简洁的“点符号”
var resultArticles = articleItems.Select(a => new {
Title = a.Title,
ArticleDate = a[Constants.FieldNames.ArticleStartDate] != null ?
((DateTime)a[Constants.FieldNames.ArticleStartDate]) : default(DateTime?),
ByLine = a[Constants.FieldNames.Byline],
FileRef = SPUtility.ConcatUrls(web.Url, a.Url)
};
此时您可以按ArticleDate对此集合进行排序,该日期将存储为真实日期,而不是字符串
resultArticles.OrderBy(a => a.ArticleDate).ToList();
答案 1 :(得分:0)
使用以下语法
var q = from el in dataSource orderby el.SortField select new {
//your projection
};
这里的要点是在一次查询中进行选择时进行排序。
修改
通过使用此语句,您可以按实际DateTime和项目字符串表示形式进行排序。