2012-07-06 33 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