2012-01-02 5 views
5

In Orchard, in che modo uno sviluppatore di moduli è in grado di apprendere come funzionano i "join", in particolare quando si uniscono a parti e record principali? Uno dei migliori aiuti che ho visto è stato in Orchard documentation, ma nessuno di questi esempi mostra come creare relazioni con parti esistenti o principali. Come esempio di qualcosa che sto cercando, ecco un frammento di codice di servizio modulo di presa da un esempio di lavoro:Informazioni sui join di frutteto e sulle relazioni dati

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

In questo caso, una consuetudine TaxonomyPart si unisce con un nucleo RoutePartRecord. Ho studiato il codice e non riesco a vedere come un TaxononmyPart sia "unificabile" a un RoutePartRecord. Analogamente, dal codice di lavoro, ecco un altro codice pilota frammento che riguarda un TagsPart personalizzato con un nucleo 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); 

ho pensato di imparare da uno dei precedenti esempi di come formare la mia domanda. Ho fatto questo:

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

L'intento del mio codice è quello di limitare gli elementi di contenuto trovati solo a quelli di un particolare contenitore (o blog). Quando il codice è stato eseguito, ha generato un'eccezione nella query di join che diceva {"could not resolve property: ContentType of: Orchard.Core.Containers.Models.ContainerPartRecord"}. Questo porta ad una serie di domande:

  1. Perché nella visualizzazione di guida() di secondo esempio è il CommonPartRecord popolate, ma non il ContainerPartRecord? In generale, come faccio a sapere quali record di parti vengono popolati e quando?
  2. Nei frammenti di codice funzionanti, in che modo esattamente il join funziona in quanto non viene specificata alcuna chiave/condizione di join (e nessuna chiave di join implicita è evidente)? Ad esempio, ho controllato il file di migrazione dei dati e le classi models e non ho trovato alcuna relazione inerente tra un tagPart e un CommonPartRecord. Quindi, oltre a guardare quel codice di esempio, come qualcuno avrebbe saputo, in primo luogo, che un simile concorso era legale o possibile?
  3. È il join che ho provato con TagsPart e ContainerPartRecord legale in qualsiasi contesto? Quale?
  4. La sintassi della query di questi esempi è principalmente un riflesso di Frutteto, di NHibernate o LINQ su NHibernate? Se è principalmente un riflesso di NHibernate, allora quale libro o articolo di NHibernate è consigliato a leggere in modo che io possa scavare più a fondo in Orchard?

Sembra che ci sia un buco nella documentazione riguardo a questi tipi di pensieri e domande, il che rende difficile scrivere un modulo. Qualunque sia la risposta per questo argomento, sarei lieto di compilare un articolo o una documentazione della frutteto della comunità.

risposta

3
  1. Il join è solo lì per abilitare il dove lo segue. Ciò non significa che la parte che viene unita verrà effettivamente ridotta dal DB. Ciò avverrà indipendentemente dall'ultima versione 1.x, e accadrà pigramente con 1.3.
  2. Non è necessaria una condizione poiché è possibile unire solo le parti in questo modo. La condizione di join è implicita: le parti sono unite dall'ID oggetto.
  3. Sì. Ciò che non è legale è che la condizione nel dove sta usando i dati che non sono disponibili dai record delle parti unite.
  4. Questi esempi sono tutte le query di Orchard Content Manager, quindi sono abbastanza limitati, ma anche abbastanza facili da compilare purché non si estendano oltre i propri limiti, poiché si può presumere che succederà e accadrà implicitamente.Se è necessario un maggiore controllo, è possibile utilizzare le nuove funzionalità HQL aggiunte negli ultimi rilasci 1.x.

Per quanto riguarda i buchi nella documentazione, beh, ma ovviamente. La documentazione che abbiamo oggi copre solo una parte molto piccola della piattaforma. Il tuo miglior riferimento oggi è il codice sorgente. Ogni contributo che potresti dare a questo è molto apprezzato da noi e dal resto della comunità. Fammi sapere se hai bisogno di aiuto con questo.

+1

Le vostre risposte sono di grande aiuto. Penso che il prossimo passo, per preparare una nuova documentazione, sia quello di elaborare la risposta n. 2. Per ora, penso che un dialogo sarebbe meglio del forum di domande e risposte. Possiamo avere una discussione via e-mail? [email protected] –