W Orchard, w jaki sposób programista modułów może dowiedzieć się, jak działają "łączenia", szczególnie podczas łączenia się z częściami rdzeniowymi i rekordami? Jedną z lepszych pomocy, jaką widziałem, było Orchard documentation, ale żaden z tych przykładów nie pokazuje, jak formować relacje z istniejącymi lub rdzennymi częściami. Jako przykład czegoś szukam, tutaj jest fragment kodu serwisowego Moduł pochodzi z przykładu roboczego:Zrozumienie powiązań z Orchardami i Relacje Danych
_contentManager
.Query<TaxonomyPart>()
.Join<RoutePartRecord>()
.Where(r => r.Title == name)
.List()
W tym przypadku niestandardowych TaxonomyPart
dołącza z rdzeniem RoutePartRecord
. Sprawdziłem kod i nie widzę jak "TaxononmyPart" można łączyć z RoutePartRecord. Podobnie, od kod działa, tu jest inny fragment kodu kierowca, który dotyczy niestandardowego TagsPart z rdzenia 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);
Myślałem, że mogę uczyć się od jednego z poprzednich przykładów, jak tworzyć własne zapytania. Zrobiłem to:
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();
Celem mojego kodu jest ograniczenie zawartości przedmiotów znalezionych tylko dla danego kontenera (lub bloga). Kiedy kod został uruchomiony, został zgłoszony wyjątek w zapytaniu dotyczącym dołączania, mówiąc: {"could not resolve property: ContentType of: Orchard.Core.Containers.Models.ContainerPartRecord"}
. To prowadzi do wielu pytań:
- Dlaczego na wyświetlaczu operatora() metoda drugim przykładzie jest
CommonPartRecord
zaludnionych, ale nieContainerPartRecord
? Ogólnie, skąd mam wiedzieć, które rekordy części są zapełniane i kiedy? - W działających fragmentach kodu, jak dokładnie działa łączenie, ponieważ nie określono żadnego klucza/warunku łączenia (i nie są widoczne żadne niejawne klucze łączenia)? Na przykład sprawdziłem plik migracji danych i klasy
models
i nie znalazłem żadnej nieodłącznej zależności między tagiem PartPart a CommonPartRecord. Tak więc, poza przyjrzeniem się przykładowemu kodowi, jak ktoś mógłby wiedzieć, że takie połączenie jest legalne lub możliwe? - Czy połączenie próbowałem z
TagsPart
iContainerPartRecord
w jakimkolwiek kontekście? Który? - Czy składnia zapytań z tych przykładów jest przede wszystkim odbiciem Orchard, NHibernate lub LINQ do NHibernate? Jeśli jest to przede wszystkim odbicie NHibernate, to która książka lub artykuł NHibernate jest polecana, aby móc głębiej zagłębić się w Orchard?
Wygląda na to, że w dokumentacji jest dziura dotycząca tego rodzaju myśli i pytań, co utrudnia napisanie modułu. Niezależnie od tego, jakie odpowiedzi można znaleźć w tym temacie, z przyjemnością skompiluję dokumentację dotyczącą artykułu lub społeczności.
Twoje odpowiedzi są OGROMNĄ pomocą. Myślę, że następnym krokiem, aby przygotować się do nowej dokumentacji, jest opracowanie odpowiedzi # 2. Na razie myślę, że dialog byłby lepszy niż forum pytań i odpowiedzi. Czy możemy porozmawiać na e-mail? [email protected] –