Понимание Orchard Joins и Data Relations - PullRequest
5 голосов
/ 03 января 2012

Как в 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"}. Это приводит к различным вопросам:

  1. Почему в методе Display () драйвера второго примера заполняется CommonPartRecord, а не ContainerPartRecord? В общем, как я узнаю, какие записи заполнены и когда?
  2. В рабочих фрагментах кода, как именно работает соединение, так как ключ / условие соединения не указаны (и неявные ключи соединения не очевидны)? Например, я проверил файл переноса данных и классы models и не обнаружил внутренней связи между TagsPart и CommonPartRecord. Таким образом, помимо просмотра этого примера кода, как кто-то мог знать, во-первых, что такое соединение является законным или возможным?
  3. Является ли соединение, которое я пробовал с TagsPart и ContainerPartRecord, законным в любом контексте? Что?
  4. Является ли синтаксис запроса в этих примерах в первую очередь отражением Orchard, NHibernate или LINQ to NHibernate? Если это в первую очередь отражение NHibernate, то какую книгу или статью NHibernate рекомендуется прочитать, чтобы я мог глубже погрузиться в сад?

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

1 Ответ

3 голосов
/ 03 января 2012
  1. Соединение существует только там, чтобы включить место, которое следует за ним.Это не значит, что присоединяемая часть будет фактически удалена из БД.Это будет происходить независимо от того, что с последним источником 1.x, и будет происходить лениво с 1.3.
  2. Вам не нужно условие, поскольку вы можете только так соединять части.Условие соединения неявно: детали соединяются с помощью идентификатора элемента.
  3. Да.Недопустимым является то, что условие в месте использования использует данные, которые недоступны из записей объединенных деталей.
  4. Все эти примеры являются запросами Orchard Content Manager, поэтому они довольно ограничены, но также довольно просты для выполнения.строить до тех пор, пока вы не выйдете за их пределы, потому что можно предположить, что многое произойдет и будет происходить неявно.Если вам нужно больше контроля, вы можете использовать новые возможности HQL, которые были добавлены в последних версиях 1.x.

Что касается дыр в документации, ну, конечно, но.Документация, которая у нас есть сегодня, охватывает только очень небольшую часть платформы.Ваша лучшая ссылка сегодня - это исходный код.Любой вклад, который вы могли бы внести в это, высоко ценится нами и остальной частью сообщества.Дайте мне знать, если вам нужна помощь с этим.

...