2015-12-16 53 views
4

我想獲得一些Sitecore項目,然後按照他們的創建日期排序他們與最新的項目第一。獲取Sitecore項目排序依據創建日期

我有以下代碼(片段):

itemID = Constants.BucketIds.NEWS; 
Item pressItem = context.GetItem(itemID); 
var pressChildItems = context 
    .SelectItems("/sitecore/content" + pressItem.Paths.ContentPath + "/*") 
    .OrderByDescending(x => x.Fields[Sitecore.FieldIDs.Created]); 
foreach (Item childItem in pressChildItems) 
{ 
    // DO SOMETHING 
} 

我收到以下錯誤回:

至少一個對象必須實現IComparable。

我不知道我應該如何解決這個問題。

回答

4

不要按Field排序,按其值排序。從你的行刪除.Fields

var pressChildItems = context 
    .SelectItems("/sitecore/content" + pressItem.Paths.ContentPath + "/*") 
    .OrderByDescending(x => x[Sitecore.FieldIDs.Created]); 

日期存儲爲yyyyMMddHHmmss...字符串,通過值,以便排序爲字符串會給你到底是從現場獲取日期值,並使用該日期順序相同的效果。

+0

謝謝!像魅力一樣工作。 –

+0

我的答案只是關於正確的排序。你一定要看看@jammykam的答案,並使用ContentSearch而不是'Sitecore Query'。 –

3

由於它看起來像是在一個Bucket中包含項目,因此您應該使用ContentSearch API(如果您在前端使用它們,則會限制結果,因爲一個存儲桶可能包含數千個項目)。

using Sitecore.ContentSearch; 
using Sitecore.ContentSearch.Linq; 
using Sitecore.ContentSearch.SearchTypes; 
using Sitecore.Data.Items; 

List<Item> ResultsItems = new List<Item>(); 
SitecoreIndexableItem bucket = Context.Database.GetItem(Constants.BucketIds.NEWS); 

using (var searchcontext = ContentSearchManager.GetIndex(bucket).CreateSearchContext()) 
{ 
    IQueryable<SearchResultItem> searchQuery = 
     searchcontext.GetQueryable<SearchResultItem>() 
             .OrderByDescending(x => x.CreatedDate) 
             .Take(10); 
    SearchResults<SearchResultItem> results = searchQuery.GetResults(); 

    // fetch the Sitecore Items if you do not want to work with the SearchResultItem 
    foreach (var hit in results.Hits) 
    { 
     Item item = hit.Document.GetItem(); 
     if (item != null) 
     { 
      ResultsItems.Add(item); 
     } 
    } 
} 
+0

這是一個很好的觀點。 –

+0

看着代碼,他的查詢只返回根項目的子項,所以我猜這不是一個真正的存儲桶(它只是命名)。但完全同意,請使用'ContentSearch'而不是'Sitecore Query'。只需將'.Where(x => x.Parent == itemID)'條件添加到可排隊和* voilla *。 –

相關問題