gpt4 book ai didi

nhibernate - 了解 Orchard 连接和数据关系

转载 作者:行者123 更新时间:2023-12-04 20:52:37 25 4
gpt4 key购买 nike

在 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"} .这导致了各种各样的问题:
  • 为什么在第二个示例的驱动程序的 Display() 方法中是 CommonPartRecord已填充,但不是 ContainerPartRecord ?一般来说,我如何知道填充了哪些部分记录以及何时填充?
  • 在工作代码片段中,由于没有指定连接键/条件(并且没有明显的隐式连接键),连接的工作情况如何?比如我查了数据迁移文件models类,并且发现 TagsPart 和 CommonPartRecord 之间没有内在关系。因此,除了查看该示例代码之外,任何人一开始怎么会知道这样的连接是合法的或可能的?
  • 是我尝试使用 TagsPart 的连接吗?和 ContainerPartRecord在任何情况下都合法吗?哪一个?
  • 这些示例的查询语法主要反射(reflect)了 Orchard、NHibernate 还是 LINQ to NHibernate?如果它主要是 NHibernate 的反射(reflect),那么推荐阅读哪本书或文章,以便我可以更深入地了解 Orchard?

  • 关于这些想法和问题的文档似乎有一个漏洞,这使得编写模块变得困难。无论可以找到该主题的任何答案,我都会很高兴将其编译成一篇文章或社区 Orchard 文档。

    最佳答案

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

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

    关于nhibernate - 了解 Orchard 连接和数据关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8704992/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com