2012-01-02 54 views
5

在果園,模塊開發人員如何能夠了解「加入」如何工作,特別是加入核心部分和記錄時?我見過的其中一個更好的幫助是Orchard documentation,但這些例子都沒有說明如何與現有或核心部分建立關係。由於這是我正在尋找一個例子,這裏是從工作示例採取的模塊服務代碼片段:瞭解果園加入和數據關係

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

在這種情況下,自定義TaxonomyPart與核心RoutePartRecord加盟。我調查了代碼,我看不到TaxononmyPart是如何「連接到」RoutePartRecord的。同樣,從工作的代碼,這裏是它涉及一個核心CommonPartRecord定製TagsPart另一片段的驅動代碼:我想我可以從任何的事先例子學習如何形成自己的查詢

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

。我這樣做:

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

我的代碼的目的是限制發現只有那些特定容器(或博客)的內容項目。代碼運行時,它在我的連接查詢中發出異常,說{"could not resolve property: ContentType of: Orchard.Core.Containers.Models.ContainerPartRecord"}。這導致了各種問題:

  1. 爲什麼在驅動程序的顯示()的第二個例子的方法是CommonPartRecord稀少,但不是ContainerPartRecord?總的來說,我怎麼知道哪部分記錄被填充,何時?
  2. 在工作代碼片段中,由於沒有指定連接鍵/條件(並且沒有隱式連接鍵顯而易見),連接究竟如何工作?例如,我檢查了數據遷移文件和models類,發現TagsPart和CommonPartRecord之間沒有內在聯繫。因此,除了查看示例代碼之外,如何人們首先知道這樣的連接是合法的還是可能的?
  3. 我在TagsPartContainerPartRecord在任何情況下合法嘗試加入嗎?哪一個?
  4. 這些例子的查詢語法主要是Orchard,NHibernate還是LINQ到NHibernate的反射?如果它主要是NHibernate的反映,那麼推薦閱讀哪些NHibernate書籍或文章,以便我可以深入挖掘Orchard?

似乎在文檔中有關於這些想法和問題的一個漏洞,這使得很難編寫模塊。無論爲這個主題找到什麼答案,我都會很高興能夠編寫成文章或社區Orchard文檔。

回答

3
  1. 該連接僅用於啓用隨後的連接。這並不意味着要加入的部分實際上會從數據庫中刪除。不管最新的1.x源代碼如何,這都會發生,並且會在1.3下發生。
  2. 你不需要條件,因爲你只能以這種方式加入零件。連接條件是隱含的:部件由項目ID連接。
  3. 是的。什麼是不合法的,在哪裏使用的數據不能從聯合零件記錄中獲得。
  4. 這些例子都是Orchard內容管理器查詢,所以它們相當受限制,但只要不超出邊界就可以輕鬆構建,因爲可以假設並隱含地發生這麼多事情。如果您需要更多控制權,則可以使用最新1.x版本中添加的新HQL功能。

至於說明文件中的漏洞,當然。我們今天的文檔僅涵蓋平臺的一小部分。你今天最好的參考是源代碼。您可以爲此做出的任何貢獻都得到我們和其他社區的高度讚賞。讓我知道你是否需要幫助。

+1

您的回答是一個巨大的幫助。我認爲準備新文檔的下一步是闡述答案#2。現在,我認爲對話會比問答論壇更好。我們可以進行電子郵件討論嗎? [email protected] – 2012-01-03 17:07:21