En Orchard, ¿cómo puede un desarrollador de módulos aprender cómo funciona el "join", especialmente cuando se une a partes centrales y registros? Una de las mejores ayudas que he visto estaba en Orchard documentation, pero ninguno de esos ejemplos muestra cómo establecer relaciones con partes existentes o centrales. Como un ejemplo de algo que estoy buscando, aquí es un fragmento de código de servicio del módulo tomada de un ejemplo de trabajo:Entender las uniones de Orchard y las relaciones de datos
_contentManager
.Query<TaxonomyPart>()
.Join<RoutePartRecord>()
.Where(r => r.Title == name)
.List()
En este caso, una costumbre TaxonomyPart
se une a un núcleo RoutePartRecord
. Investigué el código y no veo cómo TaxononmyPart se puede unir a RoutePartRecord. Del mismo modo, a partir del código de trabajo, aquí es otro código del controlador fragmento que relaciona una TagsPart personalizada 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 anteriores ejemplos 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 que se encuentran a sólo los de un contenedor en particular (o blog). Cuando se ejecutó el código, lanzó una excepción en mi consulta de unión diciendo {"could not resolve property: ContentType of: Orchard.Core.Containers.Models.ContainerPartRecord"}
. Esto conduce a una variedad de preguntas:
- ¿Por qué en la pantalla del controlador() método del segundo ejemplo es el
CommonPartRecord
poblada, pero no elContainerPartRecord
? En general, ¿cómo sabría qué parte de los registros están llenos y cuándo? - En los fragmentos de código de trabajo, ¿cómo funciona exactamente la unión ya que no se especifica ninguna clave/condición de unión (y no se ven claves de unión implícitas)? Por ejemplo, revisé el archivo de migración de datos y las clases
models
, y no encontré ninguna relación inherente entre un TagsPart y CommonPartRecord. Por lo tanto, además de mirar ese código de muestra, ¿cómo alguien hubiera sabido en primer lugar que tal unión era legal o posible? - ¿Es legal la combinación probé con
TagsPart
yContainerPartRecord
en algún contexto? ¿Cual? - ¿La sintaxis de consulta de estos ejemplos es principalmente un reflejo de Orchard, de NHibernate o de LINQ a NHibernate? Si es principalmente un reflejo de NHibernate, ¿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 se encuentre para este tema, me gustaría compilar en un artículo o documentación comunitaria de Orchard.
Sus respuestas son de GRAN ayuda. Creo que el siguiente paso, para preparar la nueva documentación, es elaborar en la respuesta # 2. Por ahora, creo que un diálogo sería mejor que un foro de preguntas y respuestas. ¿Podemos tener un debate por correo electrónico? [email protected] –