Понимание Orchard Joins и Data Relations

В Orchard, как разработчик модуля может узнать, как работает «соединение», особенно при соединении с основными частями и записями? Одна из лучших подсказок, которые я видел, была вСадовая документация, но ни один из этих примеров не показывает, как формировать отношения с существующими или основными частями. В качестве примера чего-то, что я ищу, вот фрагмент кода обслуживания модуля, взятый из рабочего примера:

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

В этом случае обычайTaxonomyPart соединяется с ядромRoutePartRecord, Я исследовал код и не вижу, как таксономическая часть «присоединяется» к 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 законно в любом контексте? Который?Является ли синтаксис запросов в этих примерах в первую очередь отражением Orchard, NHibernate или LINQ to NHibernate? Если это в первую очередь отражение NHibernate, то какую книгу или статью NHibernate рекомендуется прочитать, чтобы я мог глубже погрузиться в Orchard?

Кажется, в документации есть дыра, касающаяся подобных мыслей и вопросов, что затрудняет написание модуля. Какие бы ответы ни были найдены по этой теме, я бы с радостью собрал статью или документацию сообщества Orchard.

Ответы на вопрос(1)

Ваш ответ на вопрос