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:
CommonPartRecord
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.