2016-06-01 9 views
0

Orchard CMS(バージョン1.8)を使用してバックエンド用に構築しているモジュールのコードにコンテンツのクエリを作成しています。オーチャードCMS IContentQueryサブクエリ?

私は特定の文化に翻訳されていないコンテンツを取得しようとしています。

SQLクエリを作成し、Microsoft SQL Server Management Studioでテストできました。

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

私はイタリア語で翻訳されていないフランスの内容を見つけられないだろう、これが唯一のマスター培養物から未翻訳の文化を発見し理解し、そして、例えば、マスター文化としてEN-US与えられていないでしょう。私は後でそれを改善することができます。

IContentQueryを使用してこれを実装する方法がわかりません。この機能は、このような機能が大規模なモジュールの一部であり、そのようなクエリが既に構築されているため使用する必要があります。

私はQueryOverを使用してこのクエリを作成できますが、すでに存在するすべてのレガシーコードを変更しないでください。

これはどのようにIContentQueryを使って実装できるのか説明できますか?

私がここで役に立つ情報を忘れた場合はお知らせください。

答えて

0

あなたが正しく理解している場合は、多言語サイトがあり、そのタイプのコンテンツアイテムがまだ特定の言語に翻訳されていない特定のコンテンツタイプを確認できるようにしたいと考えています。たとえば、サイトのデフォルトの文化はen-USで、fr-FRit-ITもサポートしています。今あなたは​​にまだMyTenantコンテンツアイテムが翻訳されていないことを知りたいです。

それはあなたが達成したいものを、次のように動作するはずだと仮定すると:

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

このコードはMasterContentItemsそのものですMasterContentItemを持たないすべてのContentItemsをフェッチし、そのために何ContentItemsがありません指定されたカルチャに変換されたMasterContentItemとしてそれらを持っています。

これはかなり複雑なクエリですが、パフォーマンスはあまり良くないかもしれません。あるいは、IEnumerable<LocalizationPart> GetLocalizations(IContent content);メソッドを持つオーチャードのILocalizationServiceを注入して、それを使ってあなたが取得したローカリゼーションに指定されたカルチャが含まれているかどうかを確認することができます。

覚えておくべき重要なことは、MasterContentItem自体を持たないContentItemを探すことによってMasterContentItemsを取得できることです。

+0

この方法は機能し、基本的に私がすでに実装したものです。私は私の質問で明確ではないことをお詫びしなければならない:クエリは、私の場合、IEnumerableにすべてを配置し、Linqでそれをフィルタリングするために私に多すぎるcontentItemsを返す可能性があります。私はIContentQueryにこの "フィルタ"を直接挿入する方法があるのだろうかと思っていました。 – Bovaz

+0

ああ大丈夫、それは理にかなっている。オーチャードのよくある問題は、コンテンツのクエリが非常に遅くなり、超洗練された洗練されたソリューションがないことがわかっている限りです。あなたが冒険的な気がするなら、NHibernateを通してオーチャードテーブルに直接問い合わせることができます。これを見てください:http://weblogs.asp.net/bleroy/querying-orchard-in-hql – Lawyerson

+0

こんにちは、私はNHibernate、HQL、またはQueryOverを使って結果を得ることができます。しかし、それは私がフォームの内容(私がIContentQueryで行うすべてのもの)に基づいて大きなクエリを作成する、この機能が動作しなければならないすべてのコードを変更して変更することを強いるので、私はしたくありません。私はIContentQuery以外のものを使う度に少し心配しています。異なるバージョンのOrchardではテーブルをわずかに変更して、私のカスタムクエリをすべて確認することが恐れるからです。 – Bovaz

関連する問題