了解Orchard连接和数据关系

Bre*_*ias 5 data-binding nhibernate orchardcms

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

_contentManager
    .Query<TaxonomyPart>()
    .Join<RoutePartRecord>()
    .Where(r => r.Title == name)
    .List()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,自定义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);
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

我的代码的目的是将发现的内容项限制为仅限于特定容器(或博客)的内容项.当代码运行时,它在我的连接查询中引发了一个异常{"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?

文档中似乎有一个关于这些想法和问题的漏洞,这使得编写模块变得困难.无论在这个主题上找到什么答案,我都很乐意汇编成文章或社区Orchard文档.

Ber*_*Roy 3

  1. 连接只是为了启用它后面的位置。这并不意味着正在连接的部分实际上将从数据库中删除。无论最新的 1.x 源代码如何,都会发生这种情况,并且在 1.3 版本中会延迟发生。
  2. 您不需要条件,因为您只能通过这种方式连接零件。连接条件是隐式的:部件通过项目 ID 连接。
  3. 是的。不合法的是,where 中的条件使用的数据无法从连接的零件记录中获得。
  4. 这些示例都是 Orchard Content Manager 查询,因此它们受到相当大的限制,但只要您不超出其边界,它们也相当容易构建,因为可以假设很多事情并且会隐式发生。如果您需要更多控制,可以使用最新 1.x 版本中添加的新 HQL 功能。

至于文档中的漏洞,好吧,但是当然。我们今天拥有的文档仅涵盖了该平台的一小部分。今天最好的参考是源代码。我们和社区其他成员都会高度赞赏您为此做出的任何贡献。如果您需要这方面的帮助,请告诉我。