Sql 我可以获取项目(在Sitecore中)中的所有字段吗?

Sql 我可以获取项目(在Sitecore中)中的所有字段吗?,sql,database,sitecore,sitecore5.2,Sql,Database,Sitecore,Sitecore5.2,我正在尝试编写一个sql查询,以获取Sitecore中给定项中的所有字段 说我被卡住了是委婉的 我猜我必须在fields表上进行一些自我连接,但我正陷入困境 有人有什么想法吗?在查找字段之前,尝试调用Sitecore.Context.Item.Fields.ReadAll()。第一次尝试,但不返回所有字段 SELECT I2.Name FROM Items AS I JOIN UnversionedFields AS UF ON I.ID = UF.ItemId JOIN Version

我正在尝试编写一个sql查询,以获取Sitecore中给定项中的所有字段

说我被卡住了是委婉的

我猜我必须在fields表上进行一些自我连接,但我正陷入困境


有人有什么想法吗?

在查找字段之前,尝试调用
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

在任何情况下,您都不应该自己尝试查询Sitecore数据库。数据库会随着时间的推移而变化,这会破坏您的代码。而是使用
项.Fields
。这是一个包含所有必需字段的集合。如果要确保所有字段都已加载(真正加载,而不是延迟加载),可以使用Item.fields.ReadAll()


编辑:另外,请记住,查询不允许您构造项目,因此您会错过默认值的行为,并且根本不使用智能Sitecore缓存。

通过调用Item.Fields,您可以获得模板中指定的项目字段以及所有项目上存在的Sitecore标准字段。如果只需要在模板中定义的字段,请使用下面的代码。当然,这是假设字段名不以“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

//直接从项获取字段
列表字段名=新列表();
item.Fields.ReadAll();
FieldCollection FieldCollection=项目字段;
foreach(fieldCollection中的字段)
{
//如果不需要,请使用以下检查
//Sitecore标准字段
如果(!field.Name.StartsWith(“\uuu”))
{
fieldNames.Add(field.Name);
}
}

我自己也在研究这个问题,我使用的是基本相同的解决方案,但我已经通过使用类似于so foreach的Linq(fieldCollection.Where(x=>!x.Name.StartsWith(“”))将“”的检查推到了foreach中,您认为呢?更好、更糟、执行更快?执行此操作时,返回的所有字段名都是系统字段。我希望有一种方法可以获得用户定义的模板字段名。我想进行延迟加载。你能告诉我如何解决这个问题吗?这似乎可行,但我仍然找不到我想要的确切值。从项目I中选择值,其中I.TemplateID=T.ID内部联接项目T位于I.TemplateID=T.ID内部联接字段F位于F.ItemId=I.ID内部联接项目FN位于F.FieldId=FN.ID,其中I.TemplateID='{xxxxxxx}'和FN.Name='Description'