2012-07-06 92 views
2

我有一個內容類型的「新聞」與自定義字段「NewsDate」(DateTimeField字段)和「活動」(BooleanField)果園 - 查詢自定義字段內容項

現在我需要獲得3個活動atimes訂購desc通過NewsDate

獲取所有消息,使他們toList()從那裏操縱數據不是一個解決方案。

P.S.我需要做的是這樣的:

 var items = contentManager 
      .Query(Entities[PageType.Press]) 
      .OrderByDescending<CommonPartRecord, DateTime?>(record => record.PublishedUtc) 
      .Slice(0, 3); 

但不是PublishedUTC使用我的自定義字段「NewsDate」,並添加活性==真,然而,它是不可能的,因爲存儲在一個單獨的字段的自定義數據的果園架構XML數據。

更新: 總而言之我想從下面的查詢背後的代碼生成:

DECLARE @temp as TABLE(id int, xmldata xml) 
INSERT @temp VALUES(1,'<Data><News><NewsDate>07/14/2011 11:42:00</NewsDate><Link Title="" DisplayText="" Link="www.example.com" OpenInNewTab="True">www.example.com</Link></News></Data>') 
INSERT @temp VALUES(2,'<Data><News><NewsDate>07/11/2011 12:11:00</NewsDate><Link Title="" DisplayText="" Link="www.example.com" OpenInNewTab="True">www.example.com</Link></News></Data>') 
INSERT @temp VALUES(3,'<Data><News><NewsDate>02/21/2012 16:56:00</NewsDate><Link Title="" DisplayText="" Link="www.example.com" OpenInNewTab="True">www.example.com</Link><NewsLink></NewsLink></News></Data>') 

SELECT 
TOP 3 [id], 
[xmldata].value('(Data/News/NewsDate)[1]', 'datetime') as NewsDate 
FROM @temp 
ORDER BY NewsDate DESC 

附:我查看了DynamicContentQueryTests的代碼,但是所有示例都使用了Part,在我的情況下,Fields只是在ContentItem中: E.g.新聞內容類型包含NewsDate字段(日期時間字段)和一些部分以及

任何建議,非常感謝。

回答

3

從1.4開始,通過投影儀和基礎索引表以及Content Manager上的新API可以查詢字段。您最簡單的投注可能是創建投影。

+0

說實話,我發現沒有在谷歌和其他博客如何使用投影機在代碼中的信息。我發現的一切都是在管理區域創建小部件。 – alexsuslin 2012-07-09 13:49:33

+0

他們是內容項目,所以它不應該與代碼中的其他內容項目的工作非常不同... – 2012-07-09 17:19:52

+0

請問您給我一個示例如何檢查字段和該字段的順序?或者將我指向討論過的文檔部分?或只是給我的方向應該檢查什麼模塊代碼?提前致謝。 – alexsuslin 2012-07-10 11:18:45

2

要獲得已直接連接到內容項字段的值,你需要先查找具有相同名稱的項目,這是由果園創建內容部分。因此,對於每個新聞內容項目的Parts列表,您會發現一個名爲「NewsPart」的部分,在此Fields屬性中將包含您的NewsDateActive字段。 /從內容類型

但是,像你說的果園序列化的字段值轉換成XML存放,以防止它不必每次添加時間更改數據庫結構/刪除字段。出於這個原因,不推薦按字段進行查詢和排序,因爲所有序列化的數據都需要對每個內容項目進行反序列化。如果你希望能夠做到這一點,最好的辦法就是讓自己的內容與部分內容部分記錄和使用自己的表存儲,那麼你可以這樣做:

contentManager.Query<NewsPart, NewsPartRecord>()...

.. 。並查詢/排序你喜歡的任何值。

+0

我同意你對我自己的PartRecords,但是我們擁有6-8個實體,這些實體在新聞,事件,箴言等不同領域有所不同......我認爲它不值得創建幾乎相同的實體紀錄只是開玩笑。 – alexsuslin 2012-07-09 13:48:30

0

伯特朗是正確的。檢查這個鏈接:http://www.davidhayden.me/blog/projector-module-in-orchard-cms。您可以使用投影模塊輕鬆實現您的需求。該鏈接將告訴你要做到這一點的步驟。如果你不想要一個小部件,你也可以用你的查詢創建一個頁面。一旦模塊被激活,你會看到在左側的導航創建一個投影頁面的選項。

enter image description here

編輯:

不能您只需解析XML?你可以查詢你的內容類型'新聞'。喜歡的東西 -
var contentItems = contentManager.Query<ContentPart>("News").Join<TitlePartRecord>().Join<AutoroutePartRecord>().Join<CommonPartRecord>().List();

一旦你的,你可以通過訪問XML數據:

foreach (var item in contentItems) 
    { 
    var contentItem = (ContentItem)item.ContentItem; 
    ContentItemVersionRecord contentItemRecord = contentItem.VersionRecord; 
    string data = contentItemRecord.Data; 
    //Call some function here to parse 'data' and store the object in the list. 
    } 

「數據」在XML格式的,你需要的信息。 您可以解析它,然後將對象存儲在您的列表中,您可以通過自定義字段進行訂購。

+0

請檢查問題,我不需要小部件或頁面。我有一個模塊以XML格式發送響應。一切都是編碼的,沒有GUI。 – alexsuslin 2012-07-11 10:02:25

+0

對不起,請重新閱讀。答案已更新。 – NomadTraveler 2012-07-11 23:09:52

+0

感謝您的承諾,但正如我所說的問題,我需要生成一個查詢,以獲取由NewsDate desc訂購的數據庫中的3個項目。我沒有任何問題可以抓住所有的新聞並在內存中排序,但是如果你只需要3個項目,那麼從數據庫中獲取所有新聞是不好的做法。你不這麼認爲嗎? – alexsuslin 2012-07-12 09:43:05