Получить элемент на всех языках, на которых у него есть версия

Скажем, у нас есть Item Product (у которого есть версии на en, jp, zh и 0 версии на ru). Как мне получить этот предмет в en, jp и zh, а не в ru.

Я попробовал приведенный ниже код.

Item tempItem = Sitecore.Context.Database.GetItem(tempID);
foreach (var itemLanguage in tempItem.Languages)
{
  //Do Something
}

Здесь tempItem.Languages возвращает все четыре языка, а я ожидал только три, поскольку ru не имеет версий.

Это правильный способ добиться этого?


person Suhas    schedule 07.04.2014    source источник


Ответы (2)


Вам необходимо проверить количество версий возвращаемых элементов. Вероятно, есть лучшие способы добиться этого, но, следуя вашему собственному примеру кода, это будет выглядеть примерно так:

Item tempItem = Sitecore.Context.Database.GetItem(tempID);
foreach (var itemLanguage in tempItem.Languages)
{
    var item = tempItem.Database.GetItem(tempItem.ID, itemLanguage);
    if (item.Versions.Count > 0)
    {
        // do something. If there is no "ru" version, this will be 0
    }
}
person Mark Cassidy    schedule 07.04.2014

Я провел эксперимент, чтобы получить список языков с количеством версий для элементов с разным количеством дочерних элементов, чтобы проверить, насколько это дорого для системы.

Приведенный ниже скрипт возвращает список с названиями языков, на которых есть версии для элемента.

public static List<string> LanguagesWithContent(this Item item)
{
    var result = ItemManager.GetContentLanguages(item).Select(lang => new {
        lang.Name,
        Versions = ItemManager.GetVersions(item, lang).Count
        //this is better than db.GetItem(item.ID, lang).Versions.Count      
    }).Where(t => t.Versions > 0).Select(t => t.Name).ToList();
    return result;
}

Сравнительная производительность

Первая загрузка с использованием GetVersions — когда данные не из кеша

  • 0,7298 мс, чтобы получить количество версий с 8 языковыми версиями. Время загрузки элемента: 9,3041 мс. Языки: es-ES, es-MX, sv-SE, en, it-IT, pt-BR, fr-FR, de-DE
  • 0,0448 мс, чтобы получить количество версий с 7 языковыми версиями. Время загрузки элемента: 2,0039 мс. Языки: es-ES, es-MX, en, it-IT, fr-FR, de-DE, ro-RO
  • 0,0334 мс, чтобы получить количество версий с 6 языковыми версиями. Время загрузки элемента: 3,145 мс. Языки: es-ES, es-MX, en, it-IT, fr-FR, de-DE
  • 0,0307 мс, чтобы получить количество версий с 5 языковыми версиями. Время загрузки элемента: 1,5976 мс. Языки: es-MX, en, it-IT, fr-FR, de-DE
  • 0,0353 мс, чтобы получить количество версий с 4 языковыми версиями. Время загрузки элемента: 10,2764 мс. Языки: en, de-DE, ja-JP, da
  • 0,0258 мс, чтобы получить количество версий с 3 языковыми версиями. Время загрузки элемента: 1,9507 мс. Языки: en, de-DE, ja-JP
  • 0,0193 мс, чтобы получить количество версий с 2 ​​языковыми версиями. Время загрузки элемента: 2,0533 мс. Языки: en, de-DE
  • 0,0201 мс, чтобы получить количество версий с 1 языковой версией. Время загрузки элемента: 4,7689 мс. Языки: en

Повторите первый эксперимент с загрузкой, используя GetItem вместо GetVersions.

вывод: лучше использовать ItemManager.GetVersions(item, lang).Count, чем db.GetItem(item.ID, lang).Versions.Count, чтобы получить список языковых версий, содержащихся в элементе.

  • 3,4936 мс, чтобы получить количество версий с 8 языковыми версиями. Время загрузки элемента: 8,9118 мс. Языки: es-ES, es-MX, sv-SE, en, it-IT, pt-BR, fr-FR, de-DE
  • 0,9966 мс, чтобы получить количество версий с 7 языковыми версиями. Время загрузки элемента: 1,6489 мс. Языки: es-ES, es-MX, en, it-IT, fr-FR, de-DE, ro-RO
  • 1,0875 мс, чтобы получить количество версий с 6 языковыми версиями. Время загрузки элемента: 3,1538 мс. Языки: es-ES, es-MX, en, it-IT, fr-FR, de-DE
  • 0,5891 мс, чтобы получить количество версий с 5 языковыми версиями. Время загрузки элемента: 1,4402 мс. Языки: es-MX, en, it-IT, fr-FR, de-DE
  • 2,2096 мс, чтобы получить количество версий с 4 языковыми версиями. Время загрузки элемента: 9,8701 мс. Языки: en, de-DE, ja-JP, da
  • 0,9255 мс, чтобы получить количество версий с 3 языковыми версиями. Время загрузки элемента: 2,5175 мс. Языки: en, de-DE, ja-JP
  • 0,7606 мс, чтобы получить количество версий с двумя языковыми версиями. Время загрузки элемента: 2,2407 мс. Языки: en, de-DE
  • 1,9032 мс, чтобы получить количество версий с 1 языковой версией. Время загрузки элемента: 5,0206 мс. Языки: en

    Последующие загрузки - элемент уже кэширован

    используя в этом случае ItemManager.GetVersions(item, lang). GetItem теоретически должен давать аналогичные результаты, поскольку последующие загрузки используют кеш.

  • 0,569 мс, чтобы получить количество версий с 8 языковыми версиями. Время загрузки элемента: 0,0372 мс. Языки: es-ES, es-MX, sv-SE, en, it-IT, pt-BR, fr-FR, de-DE
  • 0,0429 мс, чтобы получить количество версий с 7 языковыми версиями. Время загрузки элемента: 0,0475 мс. Языки: es-ES, es-MX, en, it-IT, fr-FR, de-DE, ro-RO
  • 0,025 мс, чтобы получить количество версий с 6 языковыми версиями. Время загрузки элемента: 0,0247 мс. Языки: es-ES, es-MX, en, it-IT, fr-FR, de-DE
  • 0,0239 мс, чтобы получить количество версий с 5 языковыми версиями. Время загрузки элемента: 0,0201 мс. Языки: es-MX, en, it-IT, fr-FR, de-DE
  • 0,0342 мс, чтобы получить количество версий с 4 языковыми версиями. Время загрузки элемента: 0,0216 мс. Языки: en, de-DE, ja-JP, da
  • 0,0258 мс, чтобы получить количество версий с 3 языковыми версиями. Время загрузки элемента: 0,0197 мс. Языки: en, de-DE, ja-JP
  • 0,0228 мс, чтобы получить количество версий с 2 ​​языковыми версиями. Время загрузки элемента: 0,019 мс. Языки: en, de-DE
  • 0,0228 мс, чтобы получить количество версий с 1 языковой версией. Время загрузки элемента: 0,0178 мс. Языки: en
person BraveNewMath    schedule 10.07.2015
comment
Являются ли ваши результаты тестов средними для x прогонов? Или вы измеряли каждый тест только один раз? Приведенные вами цифры выглядят странно. - person user247702; 25.09.2015
comment
это снимок одного прогона, а не средний. Хотя я запускал его несколько раз, чтобы проверить, совпадают ли числа. - person BraveNewMath; 27.09.2015
comment
Лучше перебирать db.GetLanguages(), чем item.GetLanguages(). Оба они возвращают один и тот же список языков, которые используются в вашей системе (в /sitecore/system/languages), но item.GetLanguages ​​работает намного медленнее. Я выполнил 100 итераций каждого, и db.GetLanguages() заняло 0,2 мс, а item.GetLanguages() — 387,3 мс. Не перебирайте Sitecore.Globalization.LanguageDefinitions.Definitions — он возвращает полный список определений известных языков (в моем случае 131). - person BraveNewMath; 14.09.2017