2016-06-01 11 views
0

Ich baue eine Abfrage für Inhalte in den Code eines Moduls, das ich für ein Back-End mit Orchard CMS (Version 1.8) erstellen.Orchard CMS IContentQuery Unterabfragen?

Ich versuche Inhalte zu erhalten, die keine Übersetzung in eine bestimmte Kultur haben.

Ich konnte eine SQL-Abfrage schreiben und es in Microsoft SQL Server Management Studio testen.

SELECT [Id] 
    ,[CultureId] 
    ,[MasterContentItemId] 
    FROM [Orchard_MyTenant].[dbo].[Orchard_Localization_LocalizationPartRecord] 
    WHERE [CultureId] != 1 
    AND [Id] NOT IN (
    SELECT [MasterContentItemId] 
     FROM [Orchard_MyTenant].[dbo].[Orchard_Localization_LocalizationPartRecord] 
    WHERE [Id] IN (
    SELECT [Id] 
    FROM [Orchard_FestivalTV].[dbo].[Orchard_Localization_LocalizationPartRecord] 
    WHERE [CultureId] = 1 
) 
) 

Ich verstehe das nur die nicht übersetzten Kulturen aus der Master-Kultur findet, und nicht zum Beispiel en-US als Master-Kultur gegeben, würde Französisch Inhalt nicht finden, die in italienischer Sprache nicht übersetzt werden. Ich kann diese Verbesserung später machen.

Ich habe keine Ahnung, wie dies mit IContentQuery zu implementieren, und ich muss diese verwenden, da diese Funktionalität ein Teil eines größeren Moduls wäre, wo die Abfrage bereits so aufgebaut ist.

Ich bin in der Lage, diese Abfrage mit QueryOver zu machen, aber ich möchte lieber nicht gehen und ändern Sie alle Legacy-Code, der bereits vorhanden ist.

Kann jemand erklären, wie dies mit IContentQuery implementiert werden könnte?

Lassen Sie mich wissen, wenn ich hier nützliche Informationen vergessen habe.

Antwort

0

Wenn ich Sie richtig verstehe, haben Sie eine mehrsprachige Website und Sie können nach einem bestimmten Inhaltstyp suchen, dessen Inhaltselemente noch nicht in eine bestimmte Sprache übersetzt wurden. Die Standardkultur Ihrer Site lautet beispielsweise en-US, und Sie unterstützen auch fr-FR und it-IT. Jetzt wollen Sie wissen, welche MyTenant Content Items noch nicht in fr-FR übersetzt wurden.

Unter der Annahme, dass das, was Sie erreichen wollen, sollten folgende Arbeiten:

public IEnumerable<ContentItem> GetUntranslatedTenants(int cultureId) 
{ 
    var allTenants = _contentManager.Query().ForType("MyTenant").List(); 
    var untranslatedTenants = allTenants 
    .Where(x => x.As<LocalizationPart>().MasterContentItem == null && 
     !allTenants.Any(y => y.As<LocalizationPart>().MasterContentItem == x && 
     y.As<LocalizationPart>().Culture.Id == cultureId)); 

    return untranslatedTenants; 
} 

Dieser Code ruft alle content, die nicht über eine MasterContentItem haben, die die MasterContentItems selbst und für die es keine content die sie als MasterContentItem haben, die in die angegebene Kultur übersetzt werden.

Dies ist eine ziemlich komplizierte Abfrage und die Leistung ist vielleicht nicht so toll. Alternativ können Sie Orchards ILocalizationService injizieren, das eine IEnumerable<LocalizationPart> GetLocalizations(IContent content); Methode hat und diese verwenden, um zu überprüfen, ob die Lokalisierungen, die Sie erhalten, einen für die angegebene Kultur enthalten.

Ich denke, der Schlüssel zu erinnern ist, dass Sie MasterContentItems abrufen können, indem Sie nach ContentItems suchen, die selbst kein MasterContentItem haben.

+0

Diese Methode funktioniert, und ist im Grunde, was ich bereits implementiert hatte. Ich muss mich dafür entschuldigen, dass ich in meiner Frage nicht klar bin: Die Abfrage kann in meinem Fall viel zu viele contentItems zurückgeben, als dass ich alles in ein IEnumerable schreiben und dann mit Linq filtern möchte. Ich habe mich gefragt, ob es eine Möglichkeit gibt, diesen "Filter" direkt in IContentQuery einzufügen. – Bovaz

+0

Oh okay, das macht Sinn. Es ist ein häufiges Problem mit Orchard, dass Inhaltsabfragen sehr langsam werden können, und soweit ich weiß, gibt es keine besonders elegante Lösung. Wenn Sie abenteuerlustig sind, können Sie die Orchard-Tabellen direkt über NHibernate abfragen. Werfen Sie einen Blick auf diese: http://weblogs.asp.net/bleroy/querying-orchard-in-hql – Lawyerson

+0

Hallo, ich kann die Ergebnisse von usng NHibernate, HQL oder QueryOver erhalten.Das möchte ich aber nicht, denn das würde mich zwingen, den ganzen Code zu ändern, mit dem diese Funktion arbeiten soll, wo ich eine große Abfrage basierend auf dem Inhalt eines Formulars erstelle (alles andere, was ich mit IContentQuery mache). Ich bin auch etwas besorgt, wenn ich etwas anderes als IContentQuery verwende, weil ich befürchte, dass sie in verschiedenen Versionen von Orchard die Tabellen leicht ändern und mich zwingen, alle meine benutzerdefinierten Abfragen zu überprüfen. – Bovaz

Verwandte Themen