Pregunta

Estoy usando consulta caml para seleccionar todos los documentos que se han modificado o añadido por usuario.La consulta se ejecuta de forma recursiva en todos los subsitios de la colección de sitios específica.

Ahora el problema es que no puede deshacerse de las carpetas de los que también son parte del conjunto de resultados.Por ahora estoy filtrado del resultado datatable.Pero me pregunto:Es posible filtrar las carpetas de conjunto de resultados sólo por el uso de caml?

¿Fue útil?

Solución

Esta CAML realmente hace el truco:

<Where>
    <Eq>
        <FieldRef Name='FSObjType' />
        <Value Type='Integer'>0</Value>
    </Eq>
</Where>

que no le dará ninguna carpeta.

Otros consejos

Así que, me lo imaginé :) Usted puede utilizar FieldRef='ContentType' en su consulta caml y especificar typr de tipo de contenido que desea seleccionar o excluir de seleccionar.

Así que en mi caso he añadido esta condición a mi caml expresión:

<Neq><FieldRef Name='ContentType' /><Value Type='Text'>Folder</Value></Neq>

NOTA:Hay problemas en multi idioma de instalación.Nombre del tipo de contenido puede ser diferente, por lo que es bueno para obtener los nombres de los tipos de contenido de recursos

ACTUALIZACIÓN:

Parece que fue demasiado rápido en mis suposiciones.Necesito filtrar todos los contett tipos basado en el tipo de contenido de carpeta, porque en nuestros proyectos tales tipos de contenido se utilizan :(

Yo no era capaz de crear viable consulta en caml, así que he añadido un campo de vista de elemento a mi consulta que selecciona ContentTypeId de elemento de lista y el filtro de salida de las filas que están basadas en el tipo de contenido de carpeta.

Código para hacer esto es trivial, pero me molesta que esa simple tarea no puede ser realizada por pura caml.

Si está trabajando con carpetas y está usando un objeto SPQuery, también puede usar el campo ViewAttributes para permitir la recuperación recursiva de elementos. Establecer el valor en Scope = & Quot; Recursive & Quot; recuperará elementos de subcarpetas y no recuperará los objetos de carpeta en el conjunto de resultados.

myQuery.ViewAttributes = "Scope=\"Recursive\"";

Según el resultado de CAML Designer (creado por Karine Bosch y Andy Van Steenbergen y distribuido por el grupo de usuarios de Belux Information Worker) la sintaxis correcta de CAML es:

<Where>
  <Eq>
    <FieldRef Name='FSObjType' />
    <Value Type='Integer'>0</Value>
  </Eq>
</Where>
<QueryOptions>
  <ViewAttributes Scope='RecursiveAll' />
</QueryOptions>

Probé esto en PowerShell y obtuve el resultado esperado:

$qry = new-object Microsoft.SharePoint.SPQuery
$qry.Query = "<Where><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>0</Value></Eq></Where><QueryOptions><ViewAttributes Scope='RecursiveAll' /></QueryOptions>"

$items = $lib.GetItems($qry)
$items.Count

Puede reemplazar la etiqueta <QueryOptions> en CAML con la propiedad de objeto SPQuery ViewAttributes si lo prefiere, es decir, $qry.ViewAttributes = “Scope=’RecursiveAll’".

Al probar esto, asegúrese de volver a crear una instancia del objeto SPQuery cada vez, ya que no puede simplemente reasignar la propiedad Query. Una vez que se ha ejecutado la consulta, se ignora cualquier valor nuevo asignado a la propiedad Consulta. Ejecute todo el fragmento de PowerShell.

La respuesta de Dave T. no funcionó para mí, pero tomarlo como inspiración es lo que se me ocurrió con:

<Where>
  <BeginsWith><FieldRef Name="ContentTypeId" />
    <Value Type="ContentTypeId">0x0101</Value>
  </BeginsWith>
</Where>

El principal problema es que solo podemos conocer ContentTypeId a nivel de sitio , porque cuando un tipo de contenido se agrega a una lista / biblioteca se convierte en un tipo de contenido de lista y su ID se agrega con otro GUID (0x010100 ...). Y no existe la condición sin NotBeginsWith en CAML, por lo que no podemos filtrar las carpetas, pero podemos incluir solo documentos cuyo tipo de contenido de sitio es 0x0101 .

Las soluciones con el campo FSObjType no me funcionan porque tengo bibliotecas con muchos más archivos que un umbral, por lo que todos los campos de la consulta deben estar indexados y no he encontrado una manera para indexar este campo.

Esto es lo que funcionó para mí

   <Where>
      <Eq>
         <FieldRef Name='FSObjType' />
         <Value Type='Number'>1</Value>
      </Eq>
   </Where>

Verifique mi otra respuesta consulta CAML que incluye carpetas en el conjunto de resultados

Simplemente cambiando los operadores podría obtener lo que necesita

<Where>
  <NotIncludes>
    <FieldRef Name='ContentTypeId' />
    <Value Type='ContentTypeId'>0x0120</Value>
  </NotIncludes>
</Where>

No estoy seguro de si eso funcionará.

Para mí también funcionó como está escrito a continuación: -

<Where><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>1</Value></Eq></Where>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top