了解Orchard连接和数据关系

时间:2012-01-02 20:24:45

标签: nhibernate data-binding orchardcms

在Orchard,模块开发人员如何能够了解“加入”的工作方式,特别是在加入核心部件和记录时?我见过的更好的帮助之一是Orchard documentation,但这些例子都没有显示如何与现有或核心部分形成关系。作为我正在寻找的一个例子,这里是一个模块服务代码片段,取自一个工作示例:

_contentManager
    .Query<TaxonomyPart>()
    .Join<RoutePartRecord>()
    .Where(r => r.Title == name)
    .List()

在这种情况下,自定义TaxonomyPart正在加入核心RoutePartRecord。我已经调查了代码,我无法看到TaxononmyPart如何“加入”到RoutePartRecord。同样,从工作代码,这里是另一个片段驱动程序代码,它将自定义TagsPart与核心CommonPartRecord相关联:

List<string> tags = new List<string> { "hello", "there" };
IContentQuery<TagsPart, TagsPartRecord> query = _cms.Query<TagsPart, TagsPartRecord>();
query.Where(tpr => tpr.Tags.Any(t => tags.Contains(t.TagRecord.TagName)));
IEnumerable<TagsPart> parts =
    query.Join<CommonPartRecord>()
    .Where(cpr => cpr.Id != currentItemId)
    .OrderByDescending(cpr => cpr.PublishedUtc)
    .Slice(part.MaxItems);

我想我可以从之前的任何一个如何形成自己的查询的例子中学习。我这样做了:

List<string> tags = new List<string> { "hello", "there" };
IContentQuery<TagsPart, TagsPartRecord> query = _cms.Query<TagsPart, TagsPartRecord>();
query.Where(tpr => tpr.Tags.Any(t => tags.Contains(t.TagRecord.TagName)));
var stuff =
    query.Join<ContainerPartRecord>()
    .Where(ctrPartRecord => ctrPartRecord.ContentItemRecord.ContentType.Name == "Primary")
    .List();

我的代码的目的是将发现的内容项限制为仅限于特定容器(或博客)的内容项。代码运行时,它在我的连接查询中引发了一个例外{"could not resolve property: ContentType of: Orchard.Core.Containers.Models.ContainerPartRecord"}。这导致了各种各样的问题:

  1. 为什么在第二个示例的驱动程序的Display()方法中填充了CommonPartRecord,而不是ContainerPartRecord?一般来说,我怎么知道填充了什么部分记录,以及什么时候?
  2. 在工作代码片段中,由于未指定连接键/条件(并且没有明显的隐式连接键),连接的确切工作方式如何?例如,我检查了数据迁移文件和models类,发现TagsPart和CommonPartRecord之间没有固有的关系。因此,除了查看示例代码之外,首先如何知道这样的连接是合法的还是可能的?
  3. 我在TagsPartContainerPartRecord尝试的加入是否合法?哪个?
  4. 这些示例的查询语法是否主要反映了Orchard,NHibernate或LINQ to NHibernate?如果它主要是NHibernate的反映,那么建议阅读哪本NHibernate书籍或文章,以便我可以深入挖掘Orchard?
  5. 文档中似乎有一个关于这些想法和问题的漏洞,这使得编写模块变得困难。无论在这个主题上找到什么答案,我都很乐意汇编成文章或社区Orchard文档。

1 个答案:

答案 0 :(得分:3)

  1. 联接仅用于启用其后的位置。这并不意味着正在连接的部分实际上将从DB中删除。无论使用最新的1.x源代码,都会发生这种情况,并且会在1.3版本中懒散地发生。
  2. 您不需要条件,因为您只能通过这种方式加入零件。连接条件是隐式的:部件由项目ID连接。
  3. 是。不合法的是,where中的条件是使用连接部分记录中没有的数据。
  4. 这些示例都是Orchard Content Manager查询,因此它们相当受限制,但只要您不超出其边界就可以相当容易地构建,因为可以假设并且将隐式发生。如果您需要更多控制权,可以使用最新1.x版本中添加的新HQL功能。
  5. 至于文档中的漏洞,当然。我们今天拥有的文档仅涵盖平台的很小一部分。今天您最好的参考是源代码。您可以为此做出的任何贡献都得到我们和社区其他成员的高度赞赏。如果您需要帮助,请告诉我。