Sitecore按创建的日期问题排序

时间:2014-01-31 16:25:49

标签: c# sorting sitecore datecreated

我无法确定如何根据创建日期按降序排列项目列表(我知道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();
            }

2 个答案:

答案 0 :(得分:4)

您可以使用LINQ对项目进行排序:

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

显然更改查询或项目列表以符合您的要求。

添加代码后编辑:

在ascx中设置转发器,我们将使用Sitecore FieldRenderer但在此控件中禁用webediting:

<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,请查看有关Linq to Sitecore

的帖子

答案 1 :(得分:2)

使用相同的想法,您也可以使用以下...

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

它消除了额外的代码行。