【发布时间】:2009-10-22 08:43:41
【问题描述】:
我正在尝试编写一个 sql 查询来获取 Sitecore 中给定项目中的所有字段。
说我被卡住了是客气了。
我猜我必须在字段表上做一些自我连接,但我让自己陷入困境。
有人有什么想法吗?
【问题讨论】:
标签: sql database sitecore sitecore5.2
我正在尝试编写一个 sql 查询来获取 Sitecore 中给定项目中的所有字段。
说我被卡住了是客气了。
我猜我必须在字段表上做一些自我连接,但我让自己陷入困境。
有人有什么想法吗?
【问题讨论】:
标签: sql database sitecore sitecore5.2
在任何情况下,您都不应该尝试自己查询 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);
}
}
【讨论】: