Сортировка Sitecore по дате создания

Мне трудно понять, как я могу отсортировать список элементов в порядке убывания в соответствии с датой их создания (я знаю, что Sitecore позволяет сортировать элементы в порядке возрастания по дате их создания). Я все еще новичок в Sitecore, поэтому не знаю, что делать... Любые предложения будут полезны!

 Item[] BlogPosts = HomeItem.Axes.SelectItems(@"child::*[@@templatename='BlogComment']");

            if (BlogPosts != null)
            {

                DataSet ds = new DataSet();
                DataTable posts = ds.Tables.Add("posts");

                posts.Columns.Add("PostName", Type.GetType("System.String"));
                posts.Columns.Add("DateCreated", Type.GetType("System.String"));
                posts.Columns.Add("PostComment", Type.GetType("System.String"));

                foreach(Item PostItem in BlogPosts)
                {
                    DataRow dr = posts.NewRow();

                    dr["PostName"] = PostItem.Fields["Name"].Value;
                    dr["DateCreated"] = PostItem.Statistics.Created;
                    dr["PostComment"] = PostItem.Fields["Comment"].Value;

                    posts.Rows.Add(dr);
                }
                commentsListRptr.DataSource = ds;//this is a repeater I'm using to show the data
                commentsListRptr.DataMember = "posts";
                commentsListRptr.DataBind();
            }

person Dejsa Cocan    schedule 31.01.2014    source источник


Ответы (2)


Вы можете отсортировать элементы с помощью LINQ:

var items = Sitecore.Context.Database.SelectItems("/sitecore/content/home/*");
items = items.OrderBy(x => x[Sitecore.FieldIDs.Created]).Reverse();

Очевидно, измените запрос или список элементов, чтобы они соответствовали вашим требованиям.

ИЗМЕНИТЬ после добавления кода:

Настройте повторитель в вашем ascx, мы будем использовать Sitecore FieldRenderer, но отключим веб-редактирование в этом элементе управления:

<asp:Repeater ID="rptBlogPosts" runat="server" OnItemDataBound="rptBlogPosts_ItemDataBound">
    <HeaderTemplate><table></HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td><sc:FieldRenderer runat="server" ID="PostName" FieldName="Name" DisableWebEditing="True" /></td>
            <td><asp:Literal runat="server" ID="PostDate"></asp:Literal></td>
            <td><sc:FieldRenderer runat="server" ID="PostComment" FieldName="Comment" DisableWebEditing="True" /></td>
        </tr>
    </ItemTemplate>
    <FooterTemplate></table></FooterTemplate>
</asp:Repeater>

И в вашем коде позади Page_Load привяжите элемент управления, привяжите источник данных вашего повторителя, а затем установите элемент FieldRenderer и отобразите дату создания в подходящем формате.

private void Page_Load(object sender, EventArgs e)
{
    Item[] BlogPosts = HomeItem.Axes.SelectItems(@"child::*[@@templatename='BlogComment']");
    if (BlogPosts.Any())
    {
        rptBlogPosts.DataSource = BlogPosts.OrderBy(x => x[Sitecore.FieldIDs.Created]).Reverse();
        rptBlogPosts.DataBind();
    }
}

protected void rptBlogPosts_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var currentItem = e.Item.DataItem as Item;
        var scPostName = e.Item.FindControl("PostName") as FieldRenderer;
        var litPostDate = e.Item.FindControl("PostDate") as Literal;
        var scPostComment = e.Item.FindControl("PostComment") as FieldRenderer;

        scPostName.Item = currentItem;
        litPostDate.Text = currentItem.Statistics.Created.ToString("H:mm:ss MM/dd/yy");
        scPostComment.Item = currentItem;
    }
}

Ваш запрос Sitecore может быть очень дорогим с точки зрения производительности в зависимости от того, сколько у вас контента, насколько глубоко ваше дерево контента, я не уверен, какую версию Sitecore вы используете, но в любом случае вы хотите индексировать свой контент (с Lucene) и используйте это для получения сообщений. Если вы используете Sitecore 7, взгляните на этот пост о Ссылка на Sitecore

person jammykam    schedule 31.01.2014
comment
Мне нравится эта идея, но я не уверен, как заставить ее работать на меня. У меня есть список элементов, которые я пытаюсь отсортировать... Я отредактировал свой пост, включив в него пример кода! - person Dejsa Cocan; 31.01.2014
comment
@SaraDeJaneiro Я обновил пример кода. Возможно, вам придется попробовать с/без .Reverse(), я не могу вспомнить, как это делается... - person jammykam; 31.01.2014

Используя ту же идею, вы также можете использовать следующее...

var items = Sitecore.Context.Database.SelectItems("/sitecore/content/home/*").OrderByDescending(x => x.Statistics.Created);

Это устраняет дополнительную строку кода.

person blurryphoenix    schedule 06.03.2014