0

ウェブサイトにニュース セクションを作成しました。新しいものはなく、正常に動作しています。ただし、ニュース項目を日付順に並べ替えます。1 つの問題は、並べ替えの日付が複数の列にまたがっていることです。必須ではないニュース日付フィールドを作成しました。newsdate 列が空の場合、作成日が使用されます。

これらの列の両方を使用してニュース項目を並べ替えるにはどうすればよいですか

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

newsitem2: newsdate = 空、作成日 = 2012 年 8 月 7 日

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

結果(ソート順):

newsitem2、newsitem1、newsitem3

すべてが razorview-marco を使用して Umbraco で作成されるため、オブジェクトを操作するオプションが表示されないため、並べ替えは linq-query で行う必要があります。

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

3 に答える 3

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

日付フィールドが null 許容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 に答える
0

Razor で少し複雑なものを並べ替えるときは、結果をリストに変換してから、デリゲートを使用しました。これは理想的ではない特殊なケースでしたが、構文のアイデアを得ることができます。

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 に答える