在果園,模塊開發人員如何能夠了解「加入」如何工作,特別是加入核心部分和記錄時?我見過的其中一個更好的幫助是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"}
。這導致了各種問題:
- 爲什麼在驅動程序的顯示()的第二個例子的方法是
CommonPartRecord
稀少,但不是ContainerPartRecord
?總的來說,我怎麼知道哪部分記錄被填充,何時? - 在工作代碼片段中,由於沒有指定連接鍵/條件(並且沒有隱式連接鍵顯而易見),連接究竟如何工作?例如,我檢查了數據遷移文件和
models
類,發現TagsPart和CommonPartRecord之間沒有內在聯繫。因此,除了查看示例代碼之外,如何人們首先知道這樣的連接是合法的還是可能的? - 我在
TagsPart
和ContainerPartRecord
在任何情況下合法嘗試加入嗎?哪一個? - 這些例子的查詢語法主要是Orchard,NHibernate還是LINQ到NHibernate的反射?如果它主要是NHibernate的反映,那麼推薦閱讀哪些NHibernate書籍或文章,以便我可以深入挖掘Orchard?
似乎在文檔中有關於這些想法和問題的一個漏洞,這使得很難編寫模塊。無論爲這個主題找到什麼答案,我都會很高興能夠編寫成文章或社區Orchard文檔。
您的回答是一個巨大的幫助。我認爲準備新文檔的下一步是闡述答案#2。現在,我認爲對話會比問答論壇更好。我們可以進行電子郵件討論嗎? [email protected] – 2012-01-03 17:07:21