Orchard - 查询内容项中的自定义字段

时间:2012-07-06 14:40:14

标签: orchardcms custom-fields

我的内容类型为“新闻”,其中包含自定义字段“NewsDate”(DateTimeField)和“Active”(BooleanField)

现在我需要通过NewsDate

获得3个活跃的atimes order desc

获取所有新闻,将它们设为toList()并从那里操纵数据不是解决方案。

P.S。我需要做类似的事情:

        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

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

非常感谢任何建议。

3 个答案:

答案 0 :(得分:3)

要获取已直接附加到内容项的字段的值,您需要首先查找与项目同名的内容部分,该项目由Orchard创建。因此,在每个新闻内容项的Parts列表中,您将找到名为“NewsPart”的部分,在此Fields属性中将包含您的NewsDate和{{1 }}}。

但是,正如您所说,Orchard将字段值序列化为XML以进行存储,以防止每次向/从内容类型添加/删除字段时都必须更改数据库结构。因此,不建议按字段查询和排序,因为需要为每个内容项反序列化所有序列化数据。如果您希望能够这样做,最好的方法是使用内容部件记录制作您自己的内容部件并使用您自己的表进行存储,然后您可以执行此操作:

Active

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

答案 1 :(得分:3)

从1.4到Projector和底层索引表以及Content Manager上的新API,可以查询字段。您最简单的赌注实际上可能是创建投影。

答案 2 :(得分: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. 
  }

'data'包含您需要的XML格式的信息。 您可以解析它,然后将对象存储在列表中,您可以通过自定义字段对其进行排序。