Как в Orchard разработчик модуля может узнать, как работают "объединения", особенно при объединении с основными частями и записями? Одна из лучших подсказок, которые я видел, была в документации 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.