Orchard CMS IContentQuery 子查询?
Orchard CMS IContentQuery subqueries?
我正在使用 Orchard CMS(版本 1.8)为后端构建的模块代码中的内容构建查询。
我正在尝试获取没有针对特定文化的翻译的内容。
我能够编写 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 实现这一点?
如果我在这里忘记了任何有用的信息,请告诉我。
如果我没有理解错的话,您有一个多语言站点,并且您希望能够检查特定的内容类型,该类型的内容项尚未被翻译成特定的语言。例如,您网站的默认文化是 en-US
,您还支持 fr-FR
和 it-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;
}
此代码获取所有没有 MasterContentItem 的 ContentItem,这些 ContentItem 本身就是 MasterContentItem,并且没有将它们作为 MasterContentItem 翻译成指定文化的 ContentItem。
尽管这是一个相当复杂的查询,而且性能可能不是很好。或者,您可以注入 Orchard 的 ILocalizationService
,它有一个 IEnumerable<LocalizationPart> GetLocalizations(IContent content);
方法,并使用它来检查您获得的本地化是否包含针对指定文化的本地化。
我认为要记住的关键是,您可以通过查找本身没有 MasterContentItem 的 ContentItem 来获取 MasterContentItems。
我正在使用 Orchard CMS(版本 1.8)为后端构建的模块代码中的内容构建查询。
我正在尝试获取没有针对特定文化的翻译的内容。
我能够编写 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 实现这一点?
如果我在这里忘记了任何有用的信息,请告诉我。
如果我没有理解错的话,您有一个多语言站点,并且您希望能够检查特定的内容类型,该类型的内容项尚未被翻译成特定的语言。例如,您网站的默认文化是 en-US
,您还支持 fr-FR
和 it-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;
}
此代码获取所有没有 MasterContentItem 的 ContentItem,这些 ContentItem 本身就是 MasterContentItem,并且没有将它们作为 MasterContentItem 翻译成指定文化的 ContentItem。
尽管这是一个相当复杂的查询,而且性能可能不是很好。或者,您可以注入 Orchard 的 ILocalizationService
,它有一个 IEnumerable<LocalizationPart> GetLocalizations(IContent content);
方法,并使用它来检查您获得的本地化是否包含针对指定文化的本地化。
我认为要记住的关键是,您可以通过查找本身没有 MasterContentItem 的 ContentItem 来获取 MasterContentItems。