2009-10-22 10 views

Respuesta

10

En ninguno de los casos se debe siempre tratar de consultar la base de Sitecore mismo. La base de datos cambia con el tiempo y esto rompería su código. Más bien, use el Item.Fields. Esta es una colección que contiene todos los campos necesarios. Si quiere asegurarse de que todos los campos estén cargados (realmente cargados, no cargados de pereza), entonces puede usar Item.Fields.ReadAll().

Editar: Además, tenga en cuenta que las consultas no le permiten construir un elemento, por lo tanto, omite el comportamiento de los valores predeterminados y no utiliza el almacenamiento en caché inteligente de Sitecore en absoluto.

+0

Quiero hacer la carga diferida. ¿podría decirme cómo resolver esto? –

6

Intente llamar al Sitecore.Context.Item.Fields.ReadAll() antes de buscar un campo.

+0

cuando hago esto, todos los nombres de campo devueltos son campos del sistema. Esperaba que hubiera una forma de obtener nombres de campo de plantilla definidos por el usuario. – BraveNewMath

2

primer intento, pero no devuelve todos los campos

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 
+0

Esto parece funcionar bien, pero todavía no pude encontrar el valor exacto que estaba buscando. seleccione Valor de los elementos que CON (NOLOCK) combinación interna artículos T en I.TemplateID = T.ID combinación interna campos F en F.ItemId = I.ID combinación interna artículos FN en F.FieldId = FN .ID donde I.templateID = '{xxxxxxx}' y FN.Name = 'Descripción' – Netferret

1

Al llamar al elemento. Campos, obtiene los campos de elementos que ha designado en sus plantillas, así como los campos estándar de Sitecore que existen en todos los artículos. Use el código a continuación si solo desea los campos que ha definido en sus plantillas. Por supuesto, esto supone que sus nombres de campo no comienzan con "__"

// 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); 
    } 
} 
+0

He estado viendo este problema yo mismo y estoy usando básicamente la misma solución, pero he introducido el cheque para "__" en el foreach usando Linq como foreach (Campo campo en fieldCollection.Where (x => ! x.Name.StartsWith ("__"))) ¿Qué opinas? Mejor, peor, ejecución más rápida? –

Cuestiones relacionadas