Могу ли я получить все поля в элементе (в Sitecore)?
-
05-07-2019 - |
Вопрос
Я пытаюсь написать SQL-запрос, чтобы получить все поля данного элемента в Sitecore.
Сказать, что я застрял, мягко говоря.
Полагаю, мне нужно самому присоединиться к таблице полей, но я ввязываюсь в узлы.
У кого-нибудь есть идеи?
Решение
Ни в одном из случаев вам не следует пытаться запрашивать базу данных Sitecore самостоятельно. Со временем база данных меняется, и это нарушит ваш код. Скорее используйте Item.Fields
. Это коллекция, которая содержит все необходимые поля. Если вы хотите убедиться, что все поля загружены (действительно загружены, не загружены лениво), вы можете использовать Item.Fields.ReadAll ().
Редактировать. Также имейте в виду, что запросы не позволяют вам создать элемент, поэтому вы пропускаете поведение значений по умолчанию и вообще не используете интеллектуальное кэширование Sitecore.
Другие советы
Попробуйте вызвать Sitecore.Context.Item.Fields.ReadAll ()
перед поиском поля.
Первая попытка, но не возвращает все поля
SELECT I2.Name FROM
Items AS I
JOIN UnversionedFields AS UF ON I.ID = UF.ItemId
JOIN VersionedFields AS V ON I.ID = V.ItemId
JOIN SharedFields AS S ON I.ID = S.ItemId
JOIN Items AS I2 ON I2.ID = UF.FieldId OR I2.ID=V.FieldId OR I2.ID = S.FieldId
WHERE I.ID = '110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9'
GROUP BY I2.Name
Вызывая item.Fields, вы получаете поля элементов, которые вы определили в своих шаблонах, а также стандартные поля Sitecore, существующие для всех элементов. Используйте приведенный ниже код, если вам нужны только те поля, которые вы определили в своих шаблонах. Конечно, это предполагает, что имена ваших полей не начинаются с " __ "
// Get Fields directly from the Item
List<string> fieldNames = new List<string>();
item.Fields.ReadAll();
FieldCollection fieldCollection = item.Fields;
foreach (Field field in fieldCollection)
{
//Use the following check if you do not want
//the Sitecore Standard Fields
if (!field.Name.StartsWith("__"))
{
fieldNames.Add(field.Name);
}
}