2

カスタムフィールド「NewsDate」(DateTimeField)と「Active」(BooleanField)を持つコンテンツタイプ「News」があります

今、私はNewsDateまでに3つのアクティブなatimes注文説明を取得する必要があります

すべてのニュースを入手し、それらをtoList()にして、そこからデータを操作することは解決策ではありません。

PS私は次のようなことをする必要があります:

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

ただし、PublishedUTCの代わりに、カスタムフィールド "NewsDate"を使用して、Active == trueを追加します。ただし、カスタムデータをXMLデータとして別のフィールドに格納するOrchardアーキテクチャのため、これは不可能です。

更新: 一言で言えば、次のクエリの背後にあるコードから生成したいと思います:

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

PS DynamicContentQueryTestsのコードを調べましたが、すべての例でPartを使用しています。私の場合、FieldsはContentItemに含まれています。たとえば、NewsコンテンツタイプにはNewsDateフィールド(datetimeフィールド)と一部のパーツが含まれています。

どんな提案でも大歓迎です。

4

3 に答える 3

3

コンテンツアイテムに直接添付されているフィールドの値を取得するには、最初に、オーチャードによって作成されたアイテムと同じ名前のコンテンツパーツを探す必要があります。したがって、Parts各ニュースコンテンツアイテムのリストにある場合は、「NewsPart」というパーツがあり、この中にFieldsプロパティにyourフィールドNewsDateActivefieldsがあります。

ただし、あなたが言うように、Orchardはフィールド値をXMLにシリアル化して保存し、コンテンツタイプにフィールドを追加/削除するたびにデータベース構造を変更する必要がないようにします。このため、コンテンツアイテムごとにすべてのシリアル化されたデータを逆シリアル化する必要があるため、フィールドによるクエリと順序付けはお勧めしません。これを実行できるようにする場合は、コンテンツパーツレコードを使用して独自のコンテンツパーツを作成し、ストレージに独自のテーブルを使用するのが最善の方法です。次に、これを実行できます。

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

...そしてあなたが好きな値でクエリ/ソートします。

于 2012-07-07T23:40:55.027 に答える
3

1.4以降、Projectorとその基盤となるインデックステーブル、およびContentManagerの新しいAPIを介してフィールドのクエリが可能になりました。最も簡単な賭けは、実際には投影を作成することかもしれません。

于 2012-07-08T05:40:00.177 に答える
0

ベルトランは正しいです。このリンクを確認してください:http ://www.davidhayden.me/blog/projector-module-in-orchard-cms 。Projection Moduleを使用すると、要件を簡単に実装できます。リンクはそれを行うための手順を教えてくれます。ウィジェットが必要ない場合は、クエリを使用してページを作成することもできます。モジュールを有効にすると、左側のナビゲーションにプロジェクションページを作成するオプションが表示されます。

ここに画像の説明を入力してください

編集 :

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形式の情報が含まれています。それを解析してから、カスタムフィールドで並べ替えることができるオブジェクトをリストに保存できます。

于 2012-07-11T01:20:47.240 に答える