Client Object Model ottenere una lista di dati filtrati tramite CAML

Nel periodo pre-festivo (http://bitvector.tostring.it/blog/post/come-migliorare-le-prestazioni-di-una-query-tramite-client-object-model/) avevo preannunciato questo post, dove farò vedere come applicare un filtro affinchè possiamo ottenere solamente i  dati necessari alla nostra applicazione per migliorarne le prestazioni.

Per filtrare i dati che vogliamo ottenere a monte della nostra richiesta potremo utilizzare il vecchio buon CAML.

Facendo finta di voler ottenere tutti i contatti (creati in questo post: http://bitvector.tostring.it/blog/post/popoliamo-la-nostra-lista-di-contatti-tramite-il-client-object-model-di-sharepoint-2010/) che hanno nel campo Company il valore Equus creeremo una query caml uguale alla seguente:

<View><Query>
    <Where>
        <Eq>
            <FieldRef Name='Company' />
            <Value Type='Text'>Equus</Value>
        </Eq>
    </Where>
</Query></View>

Possiamo usare questa query per i nostri scopi in questa maniera:

string webUrl = "http://indirizzoMacchina";
using (ClientContext ctx = new ClientContext(webUrl))
{
    List list = ctx.Web.Lists.GetByTitle("MyContactsList");

    CamlQuery query = new CamlQuery();
    query.ViewXml = @"<View><Query>
                <Where>
                    <Eq>
                        <FieldRef Name='Company' />
                        <Value Type='Text'>Equus</Value>
                    </Eq>
                </Where>
            </Query></View>";
    ListItemCollection items = list.GetItems(query);

    ctx.Load(items, x => x.Include(i => i["FullName"], i => i["Company"], i => i["Email"]));
    ctx.ExecuteQuery();

    foreach (var item in items)
        Console.WriteLine(item["FullName"].ToString() + "\t" + item["Company"].ToString()
                        + "\t" + item["Email"].ToString());
}
Console.ReadLine();

Facendo così riusciamo ad ottenere solamente gli item necessari alla nostra applicazione e miglioriamo le prestazioni del sistema.

Enjoy