2012-01-02 10 views
5

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:

  1. ¿Por qué en la pantalla del controlador() método del segundo ejemplo es el CommonPartRecord poblada, pero no el ContainerPartRecord? En general, ¿cómo sabría qué parte de los registros están llenos y cuándo?
  2. 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?
  3. ¿Es legal la combinación probé con TagsPart y ContainerPartRecord en algún contexto? ¿Cual?
  4. ¿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.

Respuesta

3
  1. La unión está solo allí para habilitar la que sigue. No significa que la parte que se está uniendo se reducirá realmente desde el DB. Eso sucederá sin importar qué con la última fuente 1.x, y sucederá perezosamente con 1.3.
  2. No necesita una condición ya que solo puede unir partes de esta manera. La condición de unión es implícita: las partes se unen mediante la identificación del elemento.
  3. Sí. Lo que no es legal es que la condición en donde está usando datos que no están disponibles en los registros de partes unidas.
  4. Esos ejemplos son todas las consultas de Orchard Content Manager, por lo que son bastante limitadas, pero también bastante fáciles de construir, siempre y cuando no se salga de sus límites porque se puede asumir y sucederá implícitamente.Si necesita más control, puede usar las nuevas capacidades HQL que se agregaron en las últimas gotas 1.x.

En cuanto a los agujeros en la documentación, bueno, pero por supuesto. La documentación que tenemos hoy solo cubre una parte muy pequeña de la plataforma. Tu mejor referencia hoy es el código fuente. Cualquier contribución que pueda hacer a esto es muy apreciada por nosotros y por el resto de la comunidad. Avíseme si necesita ayuda con esto.

+1

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] –

Cuestiones relacionadas