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

此代码获取所有没有 MasterContentItem 的 ContentItem,这些 ContentItem 本身就是 MasterContentItem,并且没有将它们作为 MasterContentItem 翻译成指定文化的 ContentItem。

尽管这是一个相当复杂的查询,而且性能可能不是很好。或者,您可以注入 Orchard 的 ILocalizationService,它有一个 IEnumerable<LocalizationPart> GetLocalizations(IContent content); 方法,并使用它来检查您获得的本地化是否包含针对指定文化的本地化。

我认为要记住的关键是,您可以通过查找本身没有 MasterContentItem 的 ContentItem 来获取 MasterContentItems。