2016-06-01 1 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 콘텐츠 항목이 fr-FR으로 번역되지 않았는지 알고 싶습니다.

그건 당신이 달성하고자하는 무엇 가정하면, 다음과 같은 작동합니다 :

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을하지 않는 모든 ContentItem을을 인출하고있는 더 ContentItem을이 없습니다 지정된 문화권으로 변환되는 MasterContentItem으로 가져야합니다.

이것은 꽤 복잡한 쿼리이지만 성능은 좋지 않을 수 있습니다. 또는 IEnumerable<LocalizationPart> GetLocalizations(IContent content); 방법을 사용하여 오차드의 ILocalizationService을 주입하고이를 사용하여 귀하가 취득한 현지화에 지정된 문화권이 포함되어 있는지 확인할 수 있습니다.

기억해야 할 핵심 사항은 MasterContentItem 자체가없는 ContentItems를 찾아 MasterContentItems를 가져올 수 있다는 것입니다.

+0

이 방법은 작동하며 기본적으로 이미 구현 한 것입니다. 내 질문에 명확하지 않은 것에 대해 사과해야한다. 나의 경우, 질의는 IEnumerable에 모든 것을 넣고 Linq로 필터링하기 위해 너무 많은 contentItems를 반환 할 수있다. IContentQuery에이 "필터"를 직접 삽입하는 방법이 있는지 궁금합니다. – Bovaz

+0

오, 그래, 맞아. Orchard의 일반적인 문제는 콘텐츠 쿼리가 정말 느리게 진행될 수 있고 내가 아는 한 훌륭한 고급 솔루션이 없다는 것입니다. 모험을 느끼는 경우 NHibernate를 통해 직접 Orchard 테이블을 쿼리 할 수 ​​있습니다. 이것 좀 봐 : http://weblogs.asp.net/bleroy/querying-orchard-in-hql – Lawyerson

+0

안녕하세요, NHibernate, HQL, 또는 QueryOver usng하여 결과를 얻을 수 있습니다.그러나이 기능을 사용하면 양식의 내용 (IContentQuery로하는 다른 모든 항목)을 기반으로 큰 쿼리를 작성하는이 코드에서 작동해야하는 모든 코드를 변경해야합니다. 나는 다른 버전의 오차드에서 테이블을 약간 변경하여 모든 사용자 정의 쿼리를 검토 할 것을 두려워하기 때문에 IContentQuery와 다른 것을 사용할 때마다 조금 걱정된다. – Bovaz