Просто подсказка для упрощения свойств элемента: Используйте автоматические свойства с private set
и постарайтесь не явно объявлять поле данных. например,
public class SampleElement {
public SampleElement(Guid id, string name) {
Id = id;
Name = name;
}
public Guid Id {
get; private set;
}
public string Name {
get; private set;
}
}
Ни в одном из случаев вам не следует пытаться самостоятельно запросить базу данных Sitecore. База данных со временем меняется, и это нарушит ваш код. Вместо этого используйте Item.Fields
. Это коллекция, которая содержит все необходимые поля. Если вы хотите убедиться, что все поля загружены (действительно загружены, а не загружены лениво), вы можете использовать Item.Fields.ReadAll ().
Изменить: Кроме того, имейте в виду, что запросы не позволяют вам для создания Предмета, поэтому вы упускаете поведение значений по умолчанию и вообще не используете интеллектуальное кэширование Sitecore.
Try to call Sitecore.Context.Item.Fields.ReadAll()
before looking up a field.
Первая попытка, но не возвращаются все поля
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);
}
}