Comprender las uniones de Orchard y las relaciones de datos

En Orchard, ¿cómo puede un desarrollador de módulos aprender cómo funcionan las "uniones", particularmente cuando se une a partes y registros centrales? Una de las mejores ayudas que he visto fue enOrchard documentación, pero ninguno de esos ejemplos muestra cómo formar relaciones con partes existentes o centrales. Como ejemplo de algo que estoy buscando, aquí hay un fragmento de código de servicio del módulo tomado de un ejemplo de trabajo:

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

En este caso, una @ personalizaTaxonomyPart se une con un núcleoRoutePartRecord. He investigado el código, y no puedo ver cómo un TaxononmyPart es "unible" a un RoutePartRecord. Del mismo modo, desde el código de trabajo, aquí hay otro código de controlador de fragmento que relaciona un TagsPart personalizado con un núcleo 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);

Pensé que podría aprender de cualquiera de los ejemplos anteriores de cómo formar mi propia consulta. Hice esto

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();

La intención de mi código es limitar los elementos de contenido encontrados solo a los de un contenedor particular (o blog). Cuando se ejecutó el código, arrojó una excepción en mi consulta de unión que decía{"could not resolve property: ContentType of: Orchard.Core.Containers.Models.ContainerPartRecord"}. Esto lleva a una variedad de preguntas:

Por qué en el método Display () del controlador del segundo ejemplo es elCommonPartRecord poblado, pero no elContainerPartRecord? En general, ¿cómo sabría qué registros de partes se completan y cuándo?En los fragmentos de código de trabajo, ¿cómo funciona exactamente la combinación, ya que no se especifica ninguna clave / condición de combinación (y no son evidentes las claves de combinación implícitas)? Por ejemplo, verifiqué el archivo de migración de datos ymodels clases, y no encontró ninguna relación inherente entre un TagsPart y un CommonPartRecord. Por lo tanto, además de mirar ese código de muestra, ¿cómo podría alguien haber sabido en primer lugar que tal unión era legal o posible? Es la unión que probé conTagsPart yContainerPartRecord legal en cualquier contexto? ¿Cuales ¿La sintaxis de consulta de estos ejemplos es principalmente un reflejo de Orchard, de NHibernate o LINQ to NHibernate? Si es principalmente un reflejo de NHibernate, entonces, ¿qué libro o artículo de NHibernate se recomienda leer para poder profundizar en Orchard?

Parece que hay un agujero en la documentación con respecto a este tipo de pensamientos y preguntas, lo que hace que sea difícil escribir un módulo. Cualquiera que sea la respuesta que pueda encontrar para este tema, me complacería compilar en un artículo o documentación comunitaria de Orchard.

Respuestas a la pregunta(2)

Su respuesta a la pregunta