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,但是由于 Orchard 架构将自定义数据作为 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

PS我查看了DynamicContentQueryTests的代码,但是所有示例都使用Part,在我的情况下,字段只是在ContentItem中:例如新闻内容类型包含NewsDate字段(日期时间字段)和一些部分

非常感谢任何建议。

4

3 回答 3

3

要获取直接附加到 Content Item 的字段的值,您需要首先查找与该项目同名的 Content Part,它是由 Orchard 创建的。因此,在您的情况下,在Parts每个新闻内容项的列表中,您会找到一个名为“NewsPart”的部分,在此Fields属性中将包含您的NewsDateActive字段。

但是,就像您说的那样,Orchard 将字段值序列化为 XML 进行存储,以防止每次向内容类型添加/删除字段时都必须更改数据库结构。因此,不建议按字段查询和排序,因为每个 Content Item 都需要对所有序列化数据进行反序列化。如果您希望能够做到这一点,最好的方法是使用 Content Part Record 制作自己的 Content Part 并使用自己的表进行存储,那么您可以这样做:

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

...并查询/排序您喜欢的任何值。

于 2012-07-07T23:40:55.027 回答
3

从 1.4 开始,可以通过 Projector 和基础索引表以及 Content Manager 上的新 API 查询字段。实际上,您最简单的选择可能是创建一个投影。

于 2012-07-08T05:40:00.177 回答
0

Bertrand is correct. Check this link : http://www.davidhayden.me/blog/projector-module-in-orchard-cms. You can implement your requirements easily with Projection Module. The link will tell you the steps to do that. If you don't want a widget, you can create a page with your query too. Once the module is enabled, you will see the option to create a Projection Page in the left hand side navigation.

enter image description here

EDIT :

Can't you simply parse the XML? You can query your content type 'News'. Something like -
var contentItems = contentManager.Query<ContentPart>("News").Join<TitlePartRecord>().Join<AutoroutePartRecord>().Join<CommonPartRecord>().List();

Once you have that, you can access the XML data by :

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. 
  }

'data' has the information in XML format that you need. You can parse it and then store the objects in your list that you can order by your custom field.

于 2012-07-11T01:20:47.240 回答