2011-02-07 16 views
7

Sto tentando di estrarre un elenco da SharePoint tramite CAML e voglio che l'elenco sia restituito ordinato da un campo specifico. Il campo è un campo di ricerca. La query torna non ordinata quando imposto OrderBy come campo di ricerca, se utilizzo un campo di testo va bene.Query CAML a un elenco di SharePoint, ordine da un campo di ricerca

Il programma di creazione query CAML U2U restituirà questa query ordinata quando l'ho generata nell'editor.

Ecco un frammento di codice di come ho creare ed eseguire la query:

String baseQuery = "<Query><Where><Eq><FieldRef Name='paApproved' /><Value Type='Boolean'>1</Value></Eq></Where><OrderBy><FieldRef Name='paState' Ascending='True' LookupValue='TRUE' /></OrderBy></Query>"; 

qStates.Query = baseQuery; 

SPListItemCollection byState = web.Lists["paUpdates"].GetItems(qStates); 

Il resto è un ciclo for che analizza la raccolta e lo visualizza. Posso postare se necessario.

Ecco la chiamata SOAP effettuata dallo strumento di query CAML, l'ho raschiata dallo stream HTTP con wireshark.

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope 
     xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<soap:Body> 
    <GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/"> 
    <listName>paUpdates</listName> 
    <query> 
    <Query xmlns=""> 
    <Where> 
     <Eq> 
     <FieldRef Name="paApproved" /> 
     <Value Type="Boolean">1</Value> 
     </Eq> 
    </Where> 
    <OrderBy> 
     <FieldRef Name="paState" Ascending="False" /> 
    </OrderBy> 
    </Query> 
    </query> 
    <viewFields> 
    <ViewFields xmlns="" /> 
    </viewFields> 
    <queryOptions> 
    <QueryOptions xmlns="" /> 
    </queryOptions> 
    </GetListItems> 
</soap:Body> 
</soap:Envelope> 

Per qualsiasi motivo lo strumento di query CAML funzioni, il mio codice no. Qualcuno sa perché? Grazie in anticipo.

Modificato per riflettere il codice che sto effettivamente testando. Ho avuto qualche codice con valori errati.

risposta

7

L'esempio di codice che hai postato non corrisponde alla query wireshark:

<Query><Where><Eq><FieldRef Name='paApproved' /><Value Type='Boolean'>1</Value></Eq></Where><OrderBy><FieldRef Name='Title' Ascending='True' /></OrderBy></Query>

dovrebbe essere:

<Where><Eq><FieldRef Name="paApproved" /><Value Type="Boolean">1</Value></Eq></Where><OrderBy><FieldRef Name="paState" Ascending="False" /></OrderBy>

Non è necessario gli elementi <Query></Query> (see here for an example).

+0

Hai ragione. Scusa, stavo testando qualcosa. Stavo usando "title" per vedere se sarebbe stato ordinato su un campo di testo, invece di una ricerca. Il codice che stavo usando aveva il "paState" come campo, e non funziona. Ho tagliato e incollato la versione sbagliata. Ordinerà su un campo di testo, ma ora su un campo di ricerca. – kevingreen

+0

I valori ascendenti non sono uguali, ma l'ho testato in entrambi i modi in modo da non ordinare ancora nella query C#. – kevingreen

+0

Woops Ho avuto un errore di battitura. Non si dovrebbe inoltre includere il nodo '' quando si usa SPQuery. Vedi il mio aggiornamento. –

1

Ho provato a riprodurre il problema. La tua query non viene ordinata correttamente. Ho apportato due modifiche per farlo funzionare: rimosso l'elemento Query e rimosso LookupValue = 'TRUE' (non c'è un attributo con tale nome nello schema degli elementi). Dopo, tutto sembra a posto.

Problemi correlati