2008-12-04 26 views
5

En CAML Puedo consultar los elementos de lista de SharePoint utilizando el elemento "Contiene", pero no hay ningún elemento "no contiene" que pueda usar."no contiene" en CAML?

Entonces, ¿cuál es la mejor manera de obtener los artículos que no contienen una cadena? ¿Hay una mejor manera de recorrer todos y cada uno de los artículos?

Respuesta

4

La misma restricción se aplica a BeginWith. No conozco ninguna buena solución tristemente. Lo que podría hacer: haga una Contains-Query, recorra cada elemento y obtenga los ID, luego haga otra consulta grande para "ID NotEqual 1 o ID NotEqual 2 o ID NotEqual 3 ......" Dado que ID está indexado como Hasta donde yo sé, eso debería tener un impacto menor en la base de datos, pero todavía huele realmente mal.

Para una lista pequeña, no importa, para las listas más grandes usaría el SQL Server Profiler para ver cuál es el impacto.

+0

Se huele muy mal, han intentado utilizar una columna calculada, además del resto de su consulta? –

+0

@AlexanderN Una columna calculada no siempre funciona, por ejemplo, si está filtrando en el campo Creado u otros campos que forman parte de los tipos de contenido, simplemente no parecen estar disponibles en la lista Columna. –

0

Este problema con 'Contiene' y 'Comienza con' me molesta también. Espero que en la próxima versión de Sharepoint caml se extienda para ser una herramienta real, no solo una piedra en nuestra pierna.

La forma en que lo hago es especificar la consulta tanto como sea posible y luego filtrar las filas que no coinciden con las condiciones en el código C#. A veces es bastante feo, ya que a veces tienes que procesar 100 filas para finalizar con 1 resultado que coincida con las condiciones.

0

@drax: esperemos que CAML se vaya - punto. Definitivamente es uno de los peores aspectos de la programación SP actual.

+0

¡Eso sería bueno, pero hay muchas partes del producto integradas en él! –

+1

CAML como lenguaje de definición de lista (ONET.xml) es bastante útil. CAML como reemplazo de SQL es una broma, y ​​ni siquiera una buena. –

3

Entonces, ¿cuál es la mejor manera de obtener artículos que no contienen una cadena?

Intente utilizar una columna calculada para reflejar el valor que está buscando creando el valor opuesto.

Por ejemplo, supongamos que la columna se llama IsCritical. A continuación, añadir la columna como un "SÍ/NO" y la fórmula como

=ISNUMBER(FIND("Critical"), [Title])) 

Luego, en la consulta CAML

<Query> 
<Where> 
    <Eq> 
    <FieldRef Name='IsCritical'/> 
    <Value Type='Boolean'>0</Value> 
    </Eq> 
</Where> 
</Query> 

Un 0 en esta consulta refleja un poco "no es crítica". Sin embargo, no estoy seguro de cuál será el rendimiento en comparación con tener un CAML nativo "No Containts" que lamentablemente no existe.

Ver también CAML Query Schema at MSDN

0

tratar de no Incluye

<NotIncludes> 
<FieldRef Name='FileLeafRef' /> 
              <Value Type='Text'>stringvalue</Value> 
             </NotIncludes>